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 ExpectComment(String),
76 EmptyLine,
77 NewLine,
78 As,
80 Benchmark,
81 Const,
82 Fn,
83 If,
84 Else,
85 Fail,
86 Once,
87 Expect,
88 Is,
89 Let,
90 Opaque,
91 Pub,
92 Use,
93 Test,
94 Todo,
95 Type,
96 When,
97 Trace,
98 Validator,
99 Via,
100}
101
102impl fmt::Display for Token {
103 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
104 let index_str;
105 let s = match self {
106 Token::Error(c) => {
107 write!(f, "\"{c}\"")?;
108 return Ok(());
109 }
110 Token::ExpectComment(comment) => {
111 return write!(f, "/// {comment}");
112 }
113 Token::Name { name } => name,
114 Token::Ordinal { index } => {
115 index_str = index.to_string();
116 &index_str[..]
117 }
118 Token::UpName { name } => name,
119 Token::DiscardName { name } => name,
120 Token::Int { value, .. } => value,
121 Token::String { value } => value,
122 Token::ByteString { value } => value,
123 Token::NewLineLeftParen => "↳(",
124 Token::LeftParen => "(",
125 Token::RightParen => ")",
126 Token::LeftSquare => "[",
127 Token::RightSquare => "]",
128 Token::LeftBrace => "{",
129 Token::RightBrace => "}",
130 Token::Plus => "+",
131 Token::Minus => "-",
132 Token::NewLineMinus => "↳-",
133 Token::Star => "*",
134 Token::Slash => "/",
135 Token::Less => "<",
136 Token::Greater => ">",
137 Token::LessEqual => "<=",
138 Token::GreaterEqual => ">=",
139 Token::Percent => "%",
140 Token::PlusDot => "+.",
141 Token::MinusDot => "-.",
142 Token::StarDot => "*.",
143 Token::SlashDot => "/.",
144 Token::LessDot => "<.",
145 Token::GreaterDot => ">.",
146 Token::LessEqualDot => "<=.",
147 Token::GreaterEqualDot => ">=.",
148 Token::Colon => ":",
149 Token::Comma => ",",
150 Token::Hash => "#",
151 Token::Bang => "!",
152 Token::Equal => "=",
153 Token::Question => "?",
154 Token::At => "@",
155 Token::EqualEqual => "==",
156 Token::NotEqual => "!=",
157 Token::Vbar => "|",
158 Token::VbarVbar => "||",
159 Token::AmperAmper => "&&",
160 Token::And => "and",
161 Token::Or => "or",
162 Token::NewLinePipe => "↳|>",
163 Token::Pipe => "|>",
164 Token::Dot => ".",
165 Token::RArrow => "->",
166 Token::LArrow => "<-",
167 Token::DotDot => "..",
168 Token::EndOfFile => "EOF",
169 Token::Comment => "//",
170 Token::DocComment => "///",
171 Token::ModuleComment => "////",
172 Token::EmptyLine => "EMPTYLINE",
173 Token::NewLine => "NEWLINE",
174 Token::As => "as",
175 Token::Expect => "expect",
176 Token::When => "when",
177 Token::Is => "is",
178 Token::Const => "const",
179 Token::Fn => "fn",
180 Token::If => "if",
181 Token::Else => "else",
182 Token::Use => "use",
183 Token::Let => "let",
184 Token::Opaque => "opaque",
185 Token::Pub => "pub",
186 Token::Todo => "todo",
187 Token::Trace => "trace",
188 Token::Type => "type",
189 Token::Test => "test",
190 Token::Fail => "fail",
191 Token::Once => "once",
192 Token::Validator => "validator",
193 Token::Via => "via",
194 Token::Benchmark => "bench",
195 };
196 write!(f, "{s}")
197 }
198}