devalang_core/core/parser/handler/
tempo.rs

1use crate::core::{
2    lexer::token::TokenKind,
3    parser::{ statement::{ Statement, StatementKind }, driver::Parser },
4    shared::value::Value,
5    store::global::GlobalStore,
6};
7
8pub fn parse_tempo_token(parser: &mut Parser, _global_store: &mut GlobalStore) -> Statement {
9    parser.advance(); // consume 'bpm'
10
11    let Some(tempo_token) = parser.previous_clone() else {
12        return Statement::unknown();
13    };
14
15    // Expect a number or identifier
16    let Some(value_token) = parser.peek_clone() else {
17        return Statement::error(
18            tempo_token,
19            "Expected a number or identifier after 'bpm'".to_string()
20        );
21    };
22
23    let value = match value_token.kind {
24        TokenKind::Number => {
25            parser.advance();
26            Value::Number(value_token.lexeme.parse().unwrap_or(0.0))
27        }
28        TokenKind::Identifier => {
29            parser.advance();
30            Value::Identifier(value_token.lexeme.clone())
31        }
32        _ => {
33            return Statement::error(
34                value_token.clone(),
35                format!("Expected a number or identifier after 'bpm', got {:?}", value_token.kind)
36            );
37        }
38    };
39
40    Statement {
41        kind: StatementKind::Tempo,
42        value,
43        indent: tempo_token.indent,
44        line: tempo_token.line,
45        column: tempo_token.column,
46    }
47}