devalang_wasm/language/syntax/parser/driver/
trigger.rs1use 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 let parts: Vec<&str> = line.split("->").collect();
8 let trigger_def = parts[0].trim();
9
10 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 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}