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

1use crate::language::syntax::ast::{DurationValue, Statement, StatementKind, Value};
2use crate::language::syntax::parser::driver::effects::parse_chained_effects;
3use anyhow::{Result, anyhow};
4
5pub fn parse_trigger_line(line: &str, line_number: usize) -> Result<Statement> {
6    // Split by arrow operator to separate trigger definition from effects chain
7    let parts: Vec<&str> = line.split("->").collect();
8    let trigger_def = parts[0].trim();
9
10    // Parse base trigger definition
11    let mut base_parts = trigger_def
12        .trim_start_matches('.')
13        .trim()
14        .split_whitespace();
15    let entity = base_parts
16        .next()
17        .ok_or_else(|| anyhow!("trigger requires a target"))?
18        .to_string();
19
20    let mut duration = DurationValue::Auto;
21    if let Some(token) = base_parts.next() {
22        if token.eq_ignore_ascii_case("for") {
23            if let Some(value) = base_parts.next() {
24                duration =
25                    crate::language::syntax::parser::driver::duration::parse_duration_token(value)?;
26            }
27        } else {
28            duration =
29                crate::language::syntax::parser::driver::duration::parse_duration_token(token)?;
30        }
31    }
32
33    // Parse effects chain if present
34    let effects = if parts.len() > 1 {
35        Some(parse_chained_effects(&parts[1..].join("->"))?)
36    } else {
37        None
38    };
39
40    Ok(Statement::new(
41        StatementKind::Trigger {
42            entity,
43            duration,
44            effects,
45        },
46        Value::Null,
47        0,
48        line_number,
49        1,
50    ))
51}