rust_ts_json_compiler/lexer/
token.rs1use 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}