1#[derive(Debug, Clone, PartialEq)]
2pub enum Token {
3 Ident(String), DotIdent(String), IntLit(i64), FloatLit(f64), StringLit(String), BoolLit(bool), Param(String), Type, Filter, Order, Limit, Offset, Insert, Update, Delete, Upsert, Returning, Select, Required, Default, Auto, Multi, Link, Index, Unique, On, Conflict, Asc, Desc, And, Or, Not, Exists, Let, As, Match, Group, Join, Inner, LeftKw, RightKw, Outer, Cross, Transaction, Begin, Commit, Rollback, View, Materialized, Refresh, Union, Having, Distinct, In, Between, Like, Count, Avg, Sum, Min, Max, Is, Null, Upper, Lower, Length, Trim, Substring, Concat, Abs, Round, Ceil, Floor, Sqrt, Pow, Now, Extract, DateAdd, DateDiff, Cast, Case, When, Then, Else, End, Over, Partition, RowNumber, Rank, DenseRank, Alter, Drop, Add, Column, Explain, Schema, Describe, Eq, Neq, Lt, Gt, Lte, Gte, Assign, Arrow, Pipe, Coalesce, Plus, Minus, Star, Slash, LBrace, RBrace, LParen, RParen, Comma, Colon, Dot, Eof,
145}
146
147impl Token {
148 pub fn display_name(&self) -> String {
151 match self {
152 Token::Ident(s) => format!("identifier '{s}'"),
154 Token::DotIdent(s) => format!("field '.{s}'"),
155 Token::IntLit(v) => format!("number {v}"),
156 Token::FloatLit(v) => format!("decimal number {v}"),
157 Token::StringLit(s) => {
158 let preview = if s.len() > 20 {
159 let end = s.floor_char_boundary(20);
160 format!("{}...", &s[..end])
161 } else {
162 s.clone()
163 };
164 format!("string \"{preview}\"")
165 }
166 Token::BoolLit(v) => format!("{v}"),
167 Token::Param(s) => format!("parameter '${s}'"),
168
169 Token::Type => "'type'".into(),
171 Token::Filter => "'filter'".into(),
172 Token::Order => "'order'".into(),
173 Token::Limit => "'limit'".into(),
174 Token::Offset => "'offset'".into(),
175 Token::Insert => "'insert'".into(),
176 Token::Update => "'update'".into(),
177 Token::Delete => "'delete'".into(),
178 Token::Upsert => "'upsert'".into(),
179 Token::Returning => "'returning'".into(),
180 Token::Select => "'select'".into(),
181 Token::Required => "'required'".into(),
182 Token::Default => "'default'".into(),
183 Token::Auto => "'auto'".into(),
184 Token::Multi => "'multi'".into(),
185 Token::Link => "'link'".into(),
186 Token::Index => "'index'".into(),
187 Token::Unique => "'unique'".into(),
188 Token::On => "'on'".into(),
189 Token::Conflict => "'conflict'".into(),
190 Token::Asc => "'asc'".into(),
191 Token::Desc => "'desc'".into(),
192 Token::And => "'and'".into(),
193 Token::Or => "'or'".into(),
194 Token::Not => "'not'".into(),
195 Token::Exists => "'exists'".into(),
196 Token::Let => "'let'".into(),
197 Token::As => "'as'".into(),
198 Token::Match => "'match'".into(),
199 Token::Group => "'group'".into(),
200 Token::Join => "'join'".into(),
201 Token::Inner => "'inner'".into(),
202 Token::LeftKw => "'left'".into(),
203 Token::RightKw => "'right'".into(),
204 Token::Outer => "'outer'".into(),
205 Token::Cross => "'cross'".into(),
206 Token::Transaction => "'transaction'".into(),
207 Token::Begin => "'begin'".into(),
208 Token::Commit => "'commit'".into(),
209 Token::Rollback => "'rollback'".into(),
210 Token::View => "'view'".into(),
211 Token::Materialized => "'materialized'".into(),
212 Token::Refresh => "'refresh'".into(),
213 Token::Union => "'union'".into(),
214 Token::Having => "'having'".into(),
215 Token::Distinct => "'distinct'".into(),
216 Token::In => "'in'".into(),
217 Token::Between => "'between'".into(),
218 Token::Like => "'like'".into(),
219 Token::Count => "'count'".into(),
220 Token::Avg => "'avg'".into(),
221 Token::Sum => "'sum'".into(),
222 Token::Min => "'min'".into(),
223 Token::Max => "'max'".into(),
224 Token::Is => "'is'".into(),
225 Token::Null => "'null'".into(),
226
227 Token::Upper => "'upper'".into(),
229 Token::Lower => "'lower'".into(),
230 Token::Length => "'length'".into(),
231 Token::Trim => "'trim'".into(),
232 Token::Substring => "'substring'".into(),
233 Token::Concat => "'concat'".into(),
234 Token::Abs => "'abs'".into(),
235 Token::Round => "'round'".into(),
236 Token::Ceil => "'ceil'".into(),
237 Token::Floor => "'floor'".into(),
238 Token::Sqrt => "'sqrt'".into(),
239 Token::Pow => "'pow'".into(),
240 Token::Now => "'now'".into(),
241 Token::Extract => "'extract'".into(),
242 Token::DateAdd => "'date_add'".into(),
243 Token::DateDiff => "'date_diff'".into(),
244 Token::Cast => "'cast'".into(),
245 Token::Case => "'case'".into(),
246 Token::When => "'when'".into(),
247 Token::Then => "'then'".into(),
248 Token::Else => "'else'".into(),
249 Token::End => "'end'".into(),
250
251 Token::Over => "'over'".into(),
253 Token::Partition => "'partition'".into(),
254 Token::RowNumber => "'row_number'".into(),
255 Token::Rank => "'rank'".into(),
256 Token::DenseRank => "'dense_rank'".into(),
257
258 Token::Alter => "'alter'".into(),
260 Token::Drop => "'drop'".into(),
261 Token::Add => "'add'".into(),
262 Token::Column => "'column'".into(),
263 Token::Explain => "'explain'".into(),
264 Token::Schema => "'schema'".into(),
265 Token::Describe => "'describe'".into(),
266
267 Token::Eq => "'='".into(),
269 Token::Neq => "'!='".into(),
270 Token::Lt => "'<'".into(),
271 Token::Gt => "'>'".into(),
272 Token::Lte => "'<='".into(),
273 Token::Gte => "'>='".into(),
274 Token::Assign => "':='".into(),
275 Token::Arrow => "'->'".into(),
276 Token::Pipe => "'|'".into(),
277 Token::Coalesce => "'??'".into(),
278 Token::Plus => "'+'".into(),
279 Token::Minus => "'-'".into(),
280 Token::Star => "'*'".into(),
281 Token::Slash => "'/'".into(),
282
283 Token::LBrace => "'{'".into(),
285 Token::RBrace => "'}'".into(),
286 Token::LParen => "'('".into(),
287 Token::RParen => "')'".into(),
288 Token::Comma => "','".into(),
289 Token::Colon => "':'".into(),
290 Token::Dot => "'.'".into(),
291
292 Token::Eof => "end of input".into(),
293 }
294 }
295
296 pub fn keyword_str(&self) -> Option<&'static str> {
302 Some(match self {
303 Token::Type => "type",
304 Token::Filter => "filter",
305 Token::Order => "order",
306 Token::Limit => "limit",
307 Token::Offset => "offset",
308 Token::Insert => "insert",
309 Token::Update => "update",
310 Token::Delete => "delete",
311 Token::Upsert => "upsert",
312 Token::Returning => "returning",
313 Token::Select => "select",
314 Token::Required => "required",
315 Token::Default => "default",
316 Token::Auto => "auto",
317 Token::Multi => "multi",
318 Token::Link => "link",
319 Token::Index => "index",
320 Token::Unique => "unique",
321 Token::On => "on",
322 Token::Conflict => "conflict",
323 Token::Asc => "asc",
324 Token::Desc => "desc",
325 Token::And => "and",
326 Token::Or => "or",
327 Token::Not => "not",
328 Token::Exists => "exists",
329 Token::Let => "let",
330 Token::As => "as",
331 Token::Match => "match",
332 Token::Group => "group",
333 Token::Join => "join",
334 Token::Inner => "inner",
335 Token::LeftKw => "left",
336 Token::RightKw => "right",
337 Token::Outer => "outer",
338 Token::Cross => "cross",
339 Token::Transaction => "transaction",
340 Token::Begin => "begin",
341 Token::Commit => "commit",
342 Token::Rollback => "rollback",
343 Token::View => "view",
344 Token::Materialized => "materialized",
345 Token::Refresh => "refresh",
346 Token::Union => "union",
347 Token::Having => "having",
348 Token::Distinct => "distinct",
349 Token::In => "in",
350 Token::Between => "between",
351 Token::Like => "like",
352 Token::Count => "count",
353 Token::Avg => "avg",
354 Token::Sum => "sum",
355 Token::Min => "min",
356 Token::Max => "max",
357 Token::Is => "is",
358 Token::Null => "null",
359 Token::Upper => "upper",
360 Token::Lower => "lower",
361 Token::Length => "length",
362 Token::Trim => "trim",
363 Token::Substring => "substring",
364 Token::Concat => "concat",
365 Token::Abs => "abs",
366 Token::Round => "round",
367 Token::Ceil => "ceil",
368 Token::Floor => "floor",
369 Token::Sqrt => "sqrt",
370 Token::Pow => "pow",
371 Token::Now => "now",
372 Token::Extract => "extract",
373 Token::DateAdd => "date_add",
374 Token::DateDiff => "date_diff",
375 Token::Cast => "cast",
376 Token::Case => "case",
377 Token::When => "when",
378 Token::Then => "then",
379 Token::Else => "else",
380 Token::End => "end",
381 Token::Over => "over",
382 Token::Partition => "partition",
383 Token::RowNumber => "row_number",
384 Token::Rank => "rank",
385 Token::DenseRank => "dense_rank",
386 Token::Alter => "alter",
387 Token::Drop => "drop",
388 Token::Add => "add",
389 Token::Column => "column",
390 Token::Explain => "explain",
391 Token::Schema => "schema",
392 Token::Describe => "describe",
393 _ => return None,
394 })
395 }
396}