diff options
Diffstat (limited to 'server/common/src/grit.rs')
| -rw-r--r-- | server/common/src/grit.rs | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/server/common/src/grit.rs b/server/common/src/grit.rs index fab1130..dbf4f89 100644 --- a/server/common/src/grit.rs +++ b/server/common/src/grit.rs @@ -1098,3 +1098,61 @@ pub async fn parse_grit_part(path: impl AsRef<Path>) -> anyhow::Result<GritPart> .await .unwrap() } + +fn if_message_to_if_message_part(messages: Vec<IfMessage>) -> Vec<IfMessagePart> { + messages + .into_iter() + .map(|x| match x { + IfMessage::Message(message) => IfMessagePart::Message(message), + IfMessage::If { expr, message } => IfMessagePart::If { + expr, + message: if_message_to_if_message_part(message), + }, + }) + .collect() +} + +async fn maybe_expand_message( + message: &mut IfMessagePart, + basepath: &Path, +) -> anyhow::Result<Vec<IfMessagePart>> { + match message { + IfMessagePart::Message(_) => Ok(Vec::new()), + IfMessagePart::Part(part) => { + let file_path = Path::new(part.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)) + } + IfMessagePart::If { expr: _, message } => { + Box::pin(expand_messages(message, basepath)).await?; + Ok(Vec::new()) + } + } +} + +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; + } + } + Ok(()) +} + +pub async fn parse_grit_with_parts(path: impl AsRef<Path>) -> anyhow::Result<Grit> { + let path = path.as_ref(); + let mut grit = parse_grit(path).await?; + expand_messages(&mut grit.release.messages.messages, path).await?; + Ok(grit) +} |
