devalang_core/core/parser/handler/
tempo.rs

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