1use std::fmt;
2
3#[derive(
4 Clone, Debug, PartialEq, PartialOrd, Ord, Hash, Eq, Copy, serde::Serialize, serde::Deserialize,
5)]
6pub enum Base {
7 Decimal { numeric_underscore: bool },
8 Hexadecimal,
9}
10
11#[derive(Clone, Debug, PartialEq, PartialOrd, Ord, Hash, Eq)]
12pub enum Token {
13 Error(char),
14 Name { name: String },
15 Ordinal { index: u32 },
16 UpName { name: String },
17 DiscardName { name: String },
18 Int { value: String, base: Base },
19 ByteString { value: String },
20 String { value: String },
21 NewLineLeftParen, LeftParen, RightParen, LeftSquare, RightSquare, LeftBrace, RightBrace, Plus,
31 Minus,
32 NewLineMinus,
33 Star,
34 Slash,
35 Less,
36 Greater,
37 LessEqual,
38 GreaterEqual,
39 Percent,
40 PlusDot, MinusDot, StarDot, SlashDot, LessDot, GreaterDot, LessEqualDot, GreaterEqualDot, Colon,
51 Comma,
52 Hash, Bang, Question, At, Equal,
57 EqualEqual, NotEqual, Vbar, VbarVbar, AmperAmper, And, Or, NewLinePipe, Pipe, Dot, RArrow, LArrow, DotDot, EndOfFile,
71 Comment,
73 DocComment,
74 ModuleComment,
75 EmptyLine,
76 NewLine,
77 As,
79 Benchmark,
80 Const,
81 Fn,
82 If,
83 Else,
84 Fail,
85 Once,
86 Expect,
87 Is,
88 Let,
89 Opaque,
90 Pub,
91 Use,
92 Test,
93 Todo,
94 Type,
95 When,
96 Trace,
97 Validator,
98 Via,
99}
100
101impl fmt::Display for Token {
102 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
103 let index_str;
104 let s = match self {
105 Token::Error(c) => {
106 write!(f, "\"{c}\"")?;
107 return Ok(());
108 }
109 Token::Name { name } => name,
110 Token::Ordinal { index } => {
111 index_str = index.to_string();
112 &index_str[..]
113 }
114 Token::UpName { name } => name,
115 Token::DiscardName { name } => name,
116 Token::Int { value, .. } => value,
117 Token::String { value } => value,
118 Token::ByteString { value } => value,
119 Token::NewLineLeftParen => "↳(",
120 Token::LeftParen => "(",
121 Token::RightParen => ")",
122 Token::LeftSquare => "[",
123 Token::RightSquare => "]",
124 Token::LeftBrace => "{",
125 Token::RightBrace => "}",
126 Token::Plus => "+",
127 Token::Minus => "-",
128 Token::NewLineMinus => "↳-",
129 Token::Star => "*",
130 Token::Slash => "/",
131 Token::Less => "<",
132 Token::Greater => ">",
133 Token::LessEqual => "<=",
134 Token::GreaterEqual => ">=",
135 Token::Percent => "%",
136 Token::PlusDot => "+.",
137 Token::MinusDot => "-.",
138 Token::StarDot => "*.",
139 Token::SlashDot => "/.",
140 Token::LessDot => "<.",
141 Token::GreaterDot => ">.",
142 Token::LessEqualDot => "<=.",
143 Token::GreaterEqualDot => ">=.",
144 Token::Colon => ":",
145 Token::Comma => ",",
146 Token::Hash => "#",
147 Token::Bang => "!",
148 Token::Equal => "=",
149 Token::Question => "?",
150 Token::At => "@",
151 Token::EqualEqual => "==",
152 Token::NotEqual => "!=",
153 Token::Vbar => "|",
154 Token::VbarVbar => "||",
155 Token::AmperAmper => "&&",
156 Token::And => "and",
157 Token::Or => "or",
158 Token::NewLinePipe => "↳|>",
159 Token::Pipe => "|>",
160 Token::Dot => ".",
161 Token::RArrow => "->",
162 Token::LArrow => "<-",
163 Token::DotDot => "..",
164 Token::EndOfFile => "EOF",
165 Token::Comment => "//",
166 Token::DocComment => "///",
167 Token::ModuleComment => "////",
168 Token::EmptyLine => "EMPTYLINE",
169 Token::NewLine => "NEWLINE",
170 Token::As => "as",
171 Token::Expect => "expect",
172 Token::When => "when",
173 Token::Is => "is",
174 Token::Const => "const",
175 Token::Fn => "fn",
176 Token::If => "if",
177 Token::Else => "else",
178 Token::Use => "use",
179 Token::Let => "let",
180 Token::Opaque => "opaque",
181 Token::Pub => "pub",
182 Token::Todo => "todo",
183 Token::Trace => "trace",
184 Token::Type => "type",
185 Token::Test => "test",
186 Token::Fail => "fail",
187 Token::Once => "once",
188 Token::Validator => "validator",
189 Token::Via => "via",
190 Token::Benchmark => "bench",
191 };
192 write!(f, "{s}")
193 }
194}