devalang_core/core/parser/handler/
tempo.rs1use 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(); let Some(tempo_token) = parser.previous_clone() else {
15 return Statement::unknown();
16 };
17
18 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}