From 080672a5fee18336971fa18ab35bb82fb62a0225 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Tue, 30 Sep 2025 20:31:58 +0200 Subject: Add map linter --- server/locale/src/message.rs | 76 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 server/locale/src/message.rs (limited to 'server/locale/src/message.rs') diff --git a/server/locale/src/message.rs b/server/locale/src/message.rs new file mode 100644 index 00000000..bedf45fd --- /dev/null +++ b/server/locale/src/message.rs @@ -0,0 +1,76 @@ +/* + Hurry Curry! - a game about cooking + Copyright (C) 2025 Hurry Curry! Contributors + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, version 3 of the License only. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +*/ + +use crate::Locale; +use hurrycurry_protocol::{Gamedata, Message}; + +pub trait MessageDisplayExt { + fn display_message(&self, locale: &Locale, data: &Gamedata, style: &DisplayStyle) -> String; +} +impl MessageDisplayExt for Message { + fn display_message(&self, locale: &Locale, data: &Gamedata, style: &DisplayStyle) -> String { + display_message_inner(self, locale, data, style) + } +} +fn display_message_inner( + message: &Message, + locale: &Locale, + data: &Gamedata, + style: &DisplayStyle, +) -> String { + let DisplayStyle { + default, + error, + tile_item, + highlighted, + } = style; + match message { + Message::Translation { id, params } => { + let Some(template) = locale.get(&id) else { + return format!("[translation missing: {error}{id}{default}]"); + }; + let mut s = template.to_string(); + for (i, p) in params.iter().enumerate() { + s = s.replace(&format!("{{{i}}}"), &p.display_message(locale, data, style)); + } + s + } + Message::Text(s) => format!("{highlighted}{s}{default}"), + Message::Item(item_index) => format!("{tile_item}{}{default}", data.item_name(*item_index)), + Message::Tile(tile_index) => format!("{tile_item}{}{default}", data.tile_name(*tile_index)), + } +} + +pub struct DisplayStyle<'a> { + default: &'a str, + error: &'a str, + tile_item: &'a str, + highlighted: &'a str, +} +pub static PLAIN: DisplayStyle = DisplayStyle { + default: "", + error: "", + tile_item: "", + highlighted: "", +}; +pub static COLORED: DisplayStyle = DisplayStyle { + default: "\x1b[0m", + error: "\x1b[31m", + tile_item: "\x1b[34m", + highlighted: "\x1b[1m", +}; -- cgit v1.2.3-70-g09d2