devalang_core/core/parser/handler/identifier/
emit.rs1use 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(); 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(); 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}