devalang_core/core/lexer/handler/
operator.rs

1use crate::core::lexer::token::{Token, TokenKind};
2
3pub fn handle_operator_lexer(
4    ch: char,
5    chars: &mut std::iter::Peekable<std::str::Chars>,
6    current_indent: &mut usize,
7    _indent_stack: &mut [usize],
8    tokens: &mut Vec<Token>,
9    line: &mut usize,
10    column: &mut usize,
11) {
12    let next = chars.peek().copied();
13
14    let (kind, len) = match (ch, next) {
15        ('=', Some('=')) => (TokenKind::DoubleEquals, 2),
16        ('!', Some('=')) => (TokenKind::NotEquals, 2),
17        ('>', Some('=')) => (TokenKind::GreaterEqual, 2),
18        ('<', Some('=')) => (TokenKind::LessEqual, 2),
19        ('+', _) => (TokenKind::Plus, 1),
20        ('*', _) => (TokenKind::Asterisk, 1),
21        ('=', _) => (TokenKind::Equals, 1),
22        ('>', _) => (TokenKind::Greater, 1),
23        ('<', _) => (TokenKind::Less, 1),
24        _ => {
25            return;
26        }
27    };
28
29    if len == 2 {
30        chars.next(); // consume second char
31    }
32
33    tokens.push(Token {
34        kind,
35        lexeme: if len == 2 {
36            format!("{}{}", ch, next.unwrap())
37        } else {
38            ch.to_string()
39        },
40        line: *line,
41        column: *column,
42        indent: *current_indent,
43    });
44
45    *column += len;
46}