diff options
Diffstat (limited to 'server/common/src')
| -rw-r--r-- | server/common/src/grit.rs | 62 | ||||
| -rw-r--r-- | server/common/src/tests.rs | 36 |
2 files changed, 46 insertions, 52 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( |
