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