1use std::{fmt::Display, str::FromStr};
3
4#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
6pub enum TokenKind {
7 Invalid,
9 Comment,
11 Literal,
13 Identifier,
15 As, Break, Cl, Const, Continue, Else, Enum, False, Fn, For, If, Impl, In, Let, Loop, Match, Mod, Mut, Pub, Return, SelfTy, Static, Struct, Super, True, Type, Use, While, LCurly, RCurly, LBrack, RBrack, LParen, RParen, Amp, AmpAmp, AmpEq, Arrow, At, Backslash, Bang, BangBang, BangEq, Bar, BarBar, BarEq, Colon, ColonColon, Comma, Dot, DotDot, DotDotEq, Eq, EqEq, FatArrow, Grave, Gt, GtEq, GtGt, GtGtEq, Hash, HashBang, Lt, LtEq, LtLt, LtLtEq, Minus, MinusEq, Plus, PlusEq, Question, Rem, RemEq, Semi, Slash, SlashEq, Star, StarEq, Tilde, Xor, XorEq, XorXor, }
100
101impl Display for TokenKind {
102 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
103 match self {
104 TokenKind::Invalid => "invalid".fmt(f),
105 TokenKind::Comment => "comment".fmt(f),
106 TokenKind::Literal => "literal".fmt(f),
107 TokenKind::Identifier => "identifier".fmt(f),
108
109 TokenKind::As => "as".fmt(f),
110 TokenKind::Break => "break".fmt(f),
111 TokenKind::Cl => "cl".fmt(f),
112 TokenKind::Const => "const".fmt(f),
113 TokenKind::Continue => "continue".fmt(f),
114 TokenKind::Else => "else".fmt(f),
115 TokenKind::Enum => "enum".fmt(f),
116 TokenKind::False => "false".fmt(f),
117 TokenKind::Fn => "fn".fmt(f),
118 TokenKind::For => "for".fmt(f),
119 TokenKind::If => "if".fmt(f),
120 TokenKind::Impl => "impl".fmt(f),
121 TokenKind::In => "in".fmt(f),
122 TokenKind::Let => "let".fmt(f),
123 TokenKind::Loop => "loop".fmt(f),
124 TokenKind::Match => "match".fmt(f),
125 TokenKind::Mod => "mod".fmt(f),
126 TokenKind::Mut => "mut".fmt(f),
127 TokenKind::Pub => "pub".fmt(f),
128 TokenKind::Return => "return".fmt(f),
129 TokenKind::SelfTy => "Self".fmt(f),
130 TokenKind::Static => "static".fmt(f),
131 TokenKind::Struct => "struct".fmt(f),
132 TokenKind::Super => "super".fmt(f),
133 TokenKind::True => "true".fmt(f),
134 TokenKind::Type => "type".fmt(f),
135 TokenKind::Use => "use".fmt(f),
136 TokenKind::While => "while".fmt(f),
137
138 TokenKind::LCurly => "{".fmt(f),
139 TokenKind::RCurly => "}".fmt(f),
140 TokenKind::LBrack => "[".fmt(f),
141 TokenKind::RBrack => "]".fmt(f),
142 TokenKind::LParen => "(".fmt(f),
143 TokenKind::RParen => ")".fmt(f),
144 TokenKind::Amp => "&".fmt(f),
145 TokenKind::AmpAmp => "&&".fmt(f),
146 TokenKind::AmpEq => "&=".fmt(f),
147 TokenKind::Arrow => "->".fmt(f),
148 TokenKind::At => "@".fmt(f),
149 TokenKind::Backslash => "\\".fmt(f),
150 TokenKind::Bang => "!".fmt(f),
151 TokenKind::BangBang => "!!".fmt(f),
152 TokenKind::BangEq => "!=".fmt(f),
153 TokenKind::Bar => "|".fmt(f),
154 TokenKind::BarBar => "||".fmt(f),
155 TokenKind::BarEq => "|=".fmt(f),
156 TokenKind::Colon => ":".fmt(f),
157 TokenKind::ColonColon => "::".fmt(f),
158 TokenKind::Comma => ",".fmt(f),
159 TokenKind::Dot => ".".fmt(f),
160 TokenKind::DotDot => "..".fmt(f),
161 TokenKind::DotDotEq => "..=".fmt(f),
162 TokenKind::Eq => "=".fmt(f),
163 TokenKind::EqEq => "==".fmt(f),
164 TokenKind::FatArrow => "=>".fmt(f),
165 TokenKind::Grave => "`".fmt(f),
166 TokenKind::Gt => ">".fmt(f),
167 TokenKind::GtEq => ">=".fmt(f),
168 TokenKind::GtGt => ">>".fmt(f),
169 TokenKind::GtGtEq => ">>=".fmt(f),
170 TokenKind::Hash => "#".fmt(f),
171 TokenKind::HashBang => "#!".fmt(f),
172 TokenKind::Lt => "<".fmt(f),
173 TokenKind::LtEq => "<=".fmt(f),
174 TokenKind::LtLt => "<<".fmt(f),
175 TokenKind::LtLtEq => "<<=".fmt(f),
176 TokenKind::Minus => "-".fmt(f),
177 TokenKind::MinusEq => "-=".fmt(f),
178 TokenKind::Plus => "+".fmt(f),
179 TokenKind::PlusEq => "+=".fmt(f),
180 TokenKind::Question => "?".fmt(f),
181 TokenKind::Rem => "%".fmt(f),
182 TokenKind::RemEq => "%=".fmt(f),
183 TokenKind::Semi => ";".fmt(f),
184 TokenKind::Slash => "/".fmt(f),
185 TokenKind::SlashEq => "/=".fmt(f),
186 TokenKind::Star => "*".fmt(f),
187 TokenKind::StarEq => "*=".fmt(f),
188 TokenKind::Tilde => "~".fmt(f),
189 TokenKind::Xor => "^".fmt(f),
190 TokenKind::XorEq => "^=".fmt(f),
191 TokenKind::XorXor => "^^".fmt(f),
192 }
193 }
194}
195impl FromStr for TokenKind {
196 type Err = ();
198 fn from_str(s: &str) -> Result<Self, Self::Err> {
200 Ok(match s {
201 "as" => Self::As,
202 "break" => Self::Break,
203 "cl" => Self::Cl,
204 "const" => Self::Const,
205 "continue" => Self::Continue,
206 "else" => Self::Else,
207 "enum" => Self::Enum,
208 "false" => Self::False,
209 "fn" => Self::Fn,
210 "for" => Self::For,
211 "if" => Self::If,
212 "impl" => Self::Impl,
213 "in" => Self::In,
214 "let" => Self::Let,
215 "loop" => Self::Loop,
216 "match" => Self::Match,
217 "mod" => Self::Mod,
218 "mut" => Self::Mut,
219 "pub" => Self::Pub,
220 "return" => Self::Return,
221 "Self" => Self::SelfTy,
222 "static" => Self::Static,
223 "struct" => Self::Struct,
224 "super" => Self::Super,
225 "true" => Self::True,
226 "type" => Self::Type,
227 "use" => Self::Use,
228 "while" => Self::While,
229 _ => Err(())?,
230 })
231 }
232}