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

1use crate::core::{
2    lexer::token::{Token, TokenKind},
3    parser::{
4        driver::Parser,
5        statement::{Statement, StatementKind},
6    },
7    store::global::GlobalStore,
8};
9
10pub fn parse_print_token(
11    parser: &mut Parser,
12    current_token: Token,
13    _global_store: &mut GlobalStore,
14) -> Statement {
15    // consume 'print'
16    parser.advance();
17
18    let collected = parser.collect_until(|t| matches!(t.kind, TokenKind::Newline | TokenKind::EOF));
19    // Accept: print <identifier|string|number|expression>
20    let value = if collected.len() == 1 {
21        match collected[0].kind {
22            TokenKind::Identifier => {
23                crate::core::shared::value::Value::Identifier(collected[0].lexeme.clone())
24            }
25            TokenKind::String => {
26                crate::core::shared::value::Value::String(collected[0].lexeme.clone())
27            }
28            TokenKind::Number => {
29                let n = collected[0].lexeme.parse::<f32>().unwrap_or(0.0);
30                crate::core::shared::value::Value::Number(n)
31            }
32            _ => crate::core::shared::value::Value::String(collected[0].lexeme.clone()),
33        }
34    } else {
35        // Join tokens with spaces to preserve readability for expressions/text
36        let text = collected
37            .iter()
38            .filter(|t| !matches!(t.kind, TokenKind::Newline | TokenKind::EOF))
39            .map(|t| t.lexeme.clone())
40            .collect::<Vec<_>>()
41            .join(" ");
42        crate::core::shared::value::Value::String(text.trim().to_string())
43    };
44
45    Statement {
46        kind: StatementKind::Print,
47        value,
48        indent: current_token.indent,
49        line: current_token.line,
50        column: current_token.column,
51    }
52}