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

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