devalang_wasm/language/syntax/parser/driver/
routing.rs1use 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 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}