devalang_wasm/language/syntax/parser/driver/
routing.rs

1use crate::language::syntax::ast::{Statement, StatementKind, Value};
2use anyhow::{Result, anyhow};
3
4pub fn parse_routing_command<'a>(
5    mut parts: impl Iterator<Item = &'a str>,
6    line_number: usize,
7) -> Result<Statement> {
8    let source = parts
9        .next()
10        .ok_or_else(|| anyhow!("routing statement requires a source alias"))?
11        .trim_end_matches(',')
12        .to_string();
13    let mut parent = None;
14
15    while let Some(token) = parts.next() {
16        match token {
17            "->" => {
18                let target = parts
19                    .next()
20                    .ok_or_else(|| anyhow!("routing statement missing target after '->'"))?;
21                parent = Some(target.trim_matches(',').to_string());
22                break;
23            }
24            other => {
25                // Support simple "routing alias parent" form.
26                parent = Some(other.trim_matches(',').to_string());
27                break;
28            }
29        }
30    }
31
32    let mut map = std::collections::HashMap::new();
33    map.insert("source".to_string(), Value::String(source));
34    if let Some(target) = parent {
35        map.insert("target".to_string(), Value::String(target));
36    }
37
38    Ok(Statement::new(
39        StatementKind::Routing,
40        Value::Map(map),
41        0,
42        line_number,
43        1,
44    ))
45}