rust_ts_json_compiler/lexer/
token.rs

1use std::fmt::Display;
2
3#[derive(Debug, PartialEq)]
4pub enum Token {
5    Illegal,
6    Eof,
7    Ident(String),
8    Int(String),
9    Comma,
10    LRound,
11    RRound,
12    LCurly,
13    RCurly,
14    LSquare,
15    RSquare,
16    True,
17    False,
18    Str(String),
19    Dot,
20    Colon,
21}
22
23impl Display for Token {
24    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
25        match self {
26            Token::Illegal => write!(f, ""),
27            Token::Eof => write!(f, "\0"),
28            Token::Ident(value) | Token::Int(value) | Token::Str(value) => write!(f, "{value}"),
29            Token::Comma => write!(f, ","),
30            Token::LRound => write!(f, "("),
31            Token::RRound => write!(f, ")"),
32            Token::LCurly => write!(f, "{{"),
33            Token::RCurly => write!(f, "}}"),
34            Token::LSquare => write!(f, "["),
35            Token::RSquare => write!(f, "]"),
36            Token::True => write!(f, "true"),
37            Token::False => write!(f, "false"),
38            Token::Dot => write!(f, "."),
39            Token::Colon => write!(f, ":"),
40        }
41    }
42}
43
44impl From<char> for Token {
45    fn from(ch: char) -> Self {
46        match ch {
47            '(' => Self::LRound,
48            ')' => Self::RRound,
49            ',' => Self::Comma,
50            '{' => Self::LCurly,
51            '}' => Self::RCurly,
52            '[' => Self::LSquare,
53            ']' => Self::RSquare,
54            '.' => Self::Dot,
55            ':' => Self::Colon,
56            '\0' => Self::Eof,
57            _ => Self::Illegal,
58        }
59    }
60}
61
62impl From<String> for Token {
63    fn from(value: String) -> Self {
64        match value.as_str() {
65            "true" => Self::True,
66            "false" => Self::False,
67            _ => {
68                if value.chars().all(|b| b.is_ascii_digit() || b == '.') {
69                    Self::Int(value)
70                } else if (value.starts_with('"') && value.ends_with('"'))
71                    || (value.starts_with('\'') && value.ends_with('\''))
72                {
73                    Self::Str(value)
74                } else {
75                    Self::Ident(value)
76                }
77            }
78        }
79    }
80}