devalang_core/core/parser/handler/
bank.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_bank_token(parser: &mut Parser, _global_store: &mut GlobalStore) -> Statement {
9    parser.advance(); // consume 'bank'
10
11    let Some(bank_token) = parser.previous_clone() else {
12        return Statement::unknown();
13    };
14
15    let bank_value = if let Some(token) = parser.peek_clone() {
16        match token.kind {
17            TokenKind::Identifier | TokenKind::Number => {
18                parser.advance(); // consume identifier or number
19
20                let mut value = token.lexeme.clone();
21
22                // Support namespaced banks: <author>.<bank_name>
23                if let Some(next) = parser.peek_clone() {
24                    if next.kind == TokenKind::Dot {
25                        parser.advance(); // consume '.'
26                        if let Some(last) = parser.peek_clone() {
27                            match last.kind {
28                                TokenKind::Identifier | TokenKind::Number => {
29                                    parser.advance();
30                                    value = format!("{}.{}", value, last.lexeme);
31                                    Value::String(value)
32                                }
33                                _ => Value::Unknown,
34                            }
35                        } else {
36                            Value::Unknown
37                        }
38                    } else {
39                        match token.kind {
40                            TokenKind::Identifier => Value::Identifier(value),
41                            TokenKind::Number => Value::Number(value.parse::<f32>().unwrap_or(0.0)),
42                            _ => Value::Unknown,
43                        }
44                    }
45                } else {
46                    match token.kind {
47                        TokenKind::Identifier => Value::Identifier(value),
48                        TokenKind::Number => Value::Number(value.parse::<f32>().unwrap_or(0.0)),
49                        _ => Value::Unknown,
50                    }
51                }
52            }
53            _ => Value::Unknown,
54        }
55    } else {
56        return Statement::error(
57            bank_token,
58            "Expected identifier or number after 'bank'".to_string()
59        );
60    };
61
62    Statement {
63        kind: StatementKind::Bank,
64        value: bank_value,
65        indent: bank_token.indent,
66        line: bank_token.line,
67        column: bank_token.column,
68    }
69}