summaryrefslogtreecommitdiff
path: root/server/common/src/grit.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/common/src/grit.rs')
-rw-r--r--server/common/src/grit.rs58
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)
+}