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

1use crate::language::syntax::ast::{DurationValue, Statement, StatementKind, Value};
2use anyhow::{Result, anyhow};
3
4pub fn parse_trigger_line(line: &str, line_number: usize) -> Result<Statement> {
5    let mut parts = line.trim_start_matches('.').trim().split_whitespace();
6    let entity = parts
7        .next()
8        .ok_or_else(|| anyhow!("trigger requires a target"))?
9        .to_string();
10
11    let mut duration = DurationValue::Auto;
12    if let Some(token) = parts.next() {
13        if token.eq_ignore_ascii_case("for") {
14            if let Some(value) = parts.next() {
15                duration =
16                    crate::language::syntax::parser::driver::duration::parse_duration_token(value)?;
17            }
18        } else {
19            duration =
20                crate::language::syntax::parser::driver::duration::parse_duration_token(token)?;
21        }
22    }
23
24    Ok(Statement::new(
25        StatementKind::Trigger {
26            entity,
27            duration,
28            effects: None,
29        },
30        Value::Null,
31        0,
32        line_number,
33        1,
34    ))
35}