summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authorJoel Klinghed <the_jk@spawned.biz>2025-06-08 22:19:29 +0200
committerJoel Klinghed <the_jk@spawned.biz>2025-06-08 22:19:29 +0200
commit3c764b427bda59db3a2f27e3f227d6aebe052ec2 (patch)
treebed7ea4993523e48249c808c87f0b9784f154ada /server
parent3f8be66d181380795a1b235b668587098ed4d660 (diff)
grit: Keep part when expanding
Makes it possible to still keep track of which file a string comes from.
Diffstat (limited to 'server')
-rw-r--r--server/common/src/grit.rs62
-rw-r--r--server/common/src/tests.rs36
-rw-r--r--server/src/tests.rs3
-rw-r--r--server/src/trans.rs5
4 files changed, 49 insertions, 57 deletions
diff --git a/server/common/src/grit.rs b/server/common/src/grit.rs
index c0351c4..ee96500 100644
--- a/server/common/src/grit.rs
+++ b/server/common/src/grit.rs
@@ -75,7 +75,11 @@ pub struct Messages {
pub enum IfMessagePart {
Message(Message),
- Part(PartRef),
+ Part {
+ file: String,
+
+ messages: Vec<IfMessagePart>,
+ },
If {
expr: String,
@@ -85,11 +89,6 @@ pub enum IfMessagePart {
}
#[derive(Debug, PartialEq)]
-pub struct PartRef {
- pub file: String,
-}
-
-#[derive(Debug, PartialEq)]
pub struct Message {
pub desc: String,
pub name: String,
@@ -586,10 +585,7 @@ fn parse_messages_element<R: Read>(
)?));
}
"part" => {
- messages.push(IfMessagePart::Part(parse_part_element(
- &attributes,
- reader,
- )?));
+ messages.push(parse_part_element(&attributes, reader)?);
}
"if" => {
messages.push(parse_if_message_part_element(&attributes, reader)?);
@@ -729,10 +725,7 @@ fn parse_if_message_part_element<R: Read>(
)?));
}
"part" => {
- message.push(IfMessagePart::Part(parse_part_element(
- &attributes,
- reader,
- )?));
+ message.push(parse_part_element(&attributes, reader)?);
}
"if" => {
message.push(parse_if_message_part_element(&attributes, reader)?);
@@ -829,7 +822,7 @@ fn parse_if_message_element<R: Read>(
fn parse_part_element<R: Read>(
attributes: &Vec<OwnedAttribute>,
reader: &mut EventReader<R>,
-) -> anyhow::Result<PartRef> {
+) -> anyhow::Result<IfMessagePart> {
let file = get_attribute(attributes, "file")?;
loop {
@@ -864,8 +857,9 @@ fn parse_part_element<R: Read>(
}
}
- Ok(PartRef {
+ Ok(IfMessagePart::Part {
file: file.to_string(),
+ messages: Vec::new(),
})
}
@@ -1127,40 +1121,36 @@ fn if_message_to_if_message_part(messages: Vec<IfMessage>) -> Vec<IfMessagePart>
.collect()
}
-async fn maybe_expand_message(
- message: &mut IfMessagePart,
- basepath: &Path,
-) -> anyhow::Result<Vec<IfMessagePart>> {
+async fn maybe_expand_message(message: &mut IfMessagePart, basepath: &Path) -> anyhow::Result<()> {
match message {
- IfMessagePart::Message(_) => Ok(Vec::new()),
- IfMessagePart::Part(part) => {
- let file_path = Path::new(part.file.as_str());
+ IfMessagePart::Message(_) => Ok(()),
+ IfMessagePart::Part {
+ file,
+ ref mut messages,
+ } => {
+ let file_path = Path::new(file.as_str());
let part_path = if let Some(parent) = basepath.parent() {
parent.join(file_path)
} else {
file_path.to_path_buf()
};
let grit_part = parse_grit_part(part_path).await?;
- Ok(if_message_to_if_message_part(grit_part.messages))
+ *messages = if_message_to_if_message_part(grit_part.messages);
+ Ok(())
}
- IfMessagePart::If { expr: _, message } => {
+ IfMessagePart::If {
+ expr: _,
+ ref mut message,
+ } => {
Box::pin(expand_messages(message, basepath)).await?;
- Ok(Vec::new())
+ Ok(())
}
}
}
async fn expand_messages(messages: &mut Vec<IfMessagePart>, basepath: &Path) -> anyhow::Result<()> {
- let mut i = 0;
- while i < messages.len() {
- let new_messages = maybe_expand_message(&mut messages[i], basepath).await?;
- if new_messages.is_empty() {
- i += 1;
- } else {
- let j = new_messages.len();
- messages.splice(i..i + 1, new_messages);
- i += j;
- }
+ for message in messages {
+ maybe_expand_message(message, basepath).await?;
}
Ok(())
}
diff --git a/server/common/src/tests.rs b/server/common/src/tests.rs
index e7d6815..09e780b 100644
--- a/server/common/src/tests.rs
+++ b/server/common/src/tests.rs
@@ -394,11 +394,10 @@ async fn test_grit_parse_base() {
grit::IfMessagePart::If {
expr: "pp_ifdef('include_extra')".to_string(),
message: vec![
- grit::IfMessagePart::Part(
- grit::PartRef {
- file: "extra.grdp".to_string(),
- },
- ),
+ grit::IfMessagePart::Part {
+ file: "extra.grdp".to_string(),
+ messages: vec![],
+ },
],
},
grit::IfMessagePart::Message(
@@ -555,17 +554,22 @@ async fn test_grit_parse_include_parts() {
grit::IfMessagePart::If {
expr: "pp_ifdef('include_extra')".to_string(),
message: vec![
- grit::IfMessagePart::Message(
- grit::Message {
- desc: "Extra title".to_string(),
- name: "IDS_EXTRA".to_string(),
- internal_comment: None,
- meaning: None,
- content: vec![
- grit::TextPlaceholder::Text("Extra title".to_string()),
- ],
- },
- ),
+ grit::IfMessagePart::Part {
+ file: "extra.grdp".to_string(),
+ messages: vec![
+ grit::IfMessagePart::Message(
+ grit::Message {
+ desc: "Extra title".to_string(),
+ name: "IDS_EXTRA".to_string(),
+ internal_comment: None,
+ meaning: None,
+ content: vec![
+ grit::TextPlaceholder::Text("Extra title".to_string()),
+ ],
+ },
+ ),
+ ],
+ },
],
},
grit::IfMessagePart::Message(
diff --git a/server/src/tests.rs b/server/src/tests.rs
index 5f956fb..c7c1d8a 100644
--- a/server/src/tests.rs
+++ b/server/src/tests.rs
@@ -989,8 +989,7 @@ async fn test_collect_strings() {
vec![
api_model::LocalizationString {
id: "IDS_EXTRA".to_string(),
- // TODO: Should be extra.grpd
- file: "base.grd".to_string(),
+ file: "extra.grdp".to_string(),
description: "Extra title".to_string(),
meaning: "".to_string(),
source: "Extra title".to_string(),
diff --git a/server/src/trans.rs b/server/src/trans.rs
index dcef078..6a18e27 100644
--- a/server/src/trans.rs
+++ b/server/src/trans.rs
@@ -78,9 +78,8 @@ fn push_strings(
grit::IfMessagePart::If { expr: _, message } => {
push_strings(strings, file, message);
}
- grit::IfMessagePart::Part(_) => {
- // There should be none of these as we use parse_grit_with_parts
- assert!(false);
+ grit::IfMessagePart::Part { file, messages } => {
+ push_strings(strings, &file, messages);
}
}
}