devalang_core/core/parser/handler/identifier/
emit.rs

1use crate::core::{
2    lexer::token::TokenKind,
3    parser::{
4        driver::parser::Parser,
5        statement::{Statement, StatementKind},
6    },
7    store::global::GlobalStore,
8};
9use devalang_types::Value;
10
11pub fn parse_emit_token(
12    parser: &mut Parser,
13    current: crate::core::lexer::token::Token,
14    _global_store: &mut GlobalStore,
15) -> Statement {
16    parser.advance(); // consume 'emit'
17
18    let Some(ev) = parser.peek_clone() else {
19        return crate::core::parser::statement::error_from_token(
20            current,
21            "Expected event name after 'emit'".into(),
22        );
23    };
24    if ev.kind != TokenKind::Identifier {
25        return crate::core::parser::statement::error_from_token(
26            ev.clone(),
27            "Expected identifier as event name".into(),
28        );
29    }
30    let event_name = ev.lexeme.clone();
31    parser.advance(); // consume event name
32
33    // Optional payload on same line: number|string|identifier|map|array
34    let mut payload: Option<Value> = None;
35    if let Some(tok) = parser.peek_clone() {
36        if tok.line == ev.line {
37            let val = match tok.kind {
38                TokenKind::String => {
39                    parser.advance();
40                    Value::String(tok.lexeme.clone())
41                }
42                TokenKind::Number => {
43                    parser.advance();
44                    Value::Number(tok.lexeme.parse().unwrap_or(0.0))
45                }
46                TokenKind::Identifier => {
47                    parser.advance();
48                    Value::Identifier(tok.lexeme.clone())
49                }
50                TokenKind::LBrace => parser.parse_map_value().unwrap_or(Value::Null),
51                TokenKind::LBracket => parser.parse_array_value().unwrap_or(Value::Null),
52                _ => Value::Null,
53            };
54            if val != Value::Null {
55                payload = Some(val);
56            }
57        }
58    }
59
60    Statement {
61        kind: StatementKind::Emit {
62            event: event_name,
63            payload: payload.clone(),
64        },
65        value: payload.unwrap_or(Value::Null),
66        indent: current.indent,
67        line: current.line,
68        column: current.column,
69    }
70}