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, Select, Required, Multi, Link, Index, 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, Eq, Neq, Lt, Gt, Lte, Gte, Assign, Arrow, Pipe, Coalesce, Plus, Minus, Star, Slash, LBrace, RBrace, LParen, RParen, Comma, Colon, Dot, Eof,
139}
140
141impl Token {
142 pub fn display_name(&self) -> String {
145 match self {
146 Token::Ident(s) => format!("identifier '{s}'"),
148 Token::DotIdent(s) => format!("field '.{s}'"),
149 Token::IntLit(v) => format!("number {v}"),
150 Token::FloatLit(v) => format!("decimal number {v}"),
151 Token::StringLit(s) => {
152 let preview = if s.len() > 20 {
153 let end = s.floor_char_boundary(20);
154 format!("{}...", &s[..end])
155 } else {
156 s.clone()
157 };
158 format!("string \"{preview}\"")
159 }
160 Token::BoolLit(v) => format!("{v}"),
161 Token::Param(s) => format!("parameter '${s}'"),
162
163 Token::Type => "'type'".into(),
165 Token::Filter => "'filter'".into(),
166 Token::Order => "'order'".into(),
167 Token::Limit => "'limit'".into(),
168 Token::Offset => "'offset'".into(),
169 Token::Insert => "'insert'".into(),
170 Token::Update => "'update'".into(),
171 Token::Delete => "'delete'".into(),
172 Token::Upsert => "'upsert'".into(),
173 Token::Select => "'select'".into(),
174 Token::Required => "'required'".into(),
175 Token::Multi => "'multi'".into(),
176 Token::Link => "'link'".into(),
177 Token::Index => "'index'".into(),
178 Token::On => "'on'".into(),
179 Token::Conflict => "'conflict'".into(),
180 Token::Asc => "'asc'".into(),
181 Token::Desc => "'desc'".into(),
182 Token::And => "'and'".into(),
183 Token::Or => "'or'".into(),
184 Token::Not => "'not'".into(),
185 Token::Exists => "'exists'".into(),
186 Token::Let => "'let'".into(),
187 Token::As => "'as'".into(),
188 Token::Match => "'match'".into(),
189 Token::Group => "'group'".into(),
190 Token::Join => "'join'".into(),
191 Token::Inner => "'inner'".into(),
192 Token::LeftKw => "'left'".into(),
193 Token::RightKw => "'right'".into(),
194 Token::Outer => "'outer'".into(),
195 Token::Cross => "'cross'".into(),
196 Token::Transaction => "'transaction'".into(),
197 Token::Begin => "'begin'".into(),
198 Token::Commit => "'commit'".into(),
199 Token::Rollback => "'rollback'".into(),
200 Token::View => "'view'".into(),
201 Token::Materialized => "'materialized'".into(),
202 Token::Refresh => "'refresh'".into(),
203 Token::Union => "'union'".into(),
204 Token::Having => "'having'".into(),
205 Token::Distinct => "'distinct'".into(),
206 Token::In => "'in'".into(),
207 Token::Between => "'between'".into(),
208 Token::Like => "'like'".into(),
209 Token::Count => "'count'".into(),
210 Token::Avg => "'avg'".into(),
211 Token::Sum => "'sum'".into(),
212 Token::Min => "'min'".into(),
213 Token::Max => "'max'".into(),
214 Token::Is => "'is'".into(),
215 Token::Null => "'null'".into(),
216
217 Token::Upper => "'upper'".into(),
219 Token::Lower => "'lower'".into(),
220 Token::Length => "'length'".into(),
221 Token::Trim => "'trim'".into(),
222 Token::Substring => "'substring'".into(),
223 Token::Concat => "'concat'".into(),
224 Token::Abs => "'abs'".into(),
225 Token::Round => "'round'".into(),
226 Token::Ceil => "'ceil'".into(),
227 Token::Floor => "'floor'".into(),
228 Token::Sqrt => "'sqrt'".into(),
229 Token::Pow => "'pow'".into(),
230 Token::Now => "'now'".into(),
231 Token::Extract => "'extract'".into(),
232 Token::DateAdd => "'date_add'".into(),
233 Token::DateDiff => "'date_diff'".into(),
234 Token::Cast => "'cast'".into(),
235 Token::Case => "'case'".into(),
236 Token::When => "'when'".into(),
237 Token::Then => "'then'".into(),
238 Token::Else => "'else'".into(),
239 Token::End => "'end'".into(),
240
241 Token::Over => "'over'".into(),
243 Token::Partition => "'partition'".into(),
244 Token::RowNumber => "'row_number'".into(),
245 Token::Rank => "'rank'".into(),
246 Token::DenseRank => "'dense_rank'".into(),
247
248 Token::Alter => "'alter'".into(),
250 Token::Drop => "'drop'".into(),
251 Token::Add => "'add'".into(),
252 Token::Column => "'column'".into(),
253 Token::Explain => "'explain'".into(),
254
255 Token::Eq => "'='".into(),
257 Token::Neq => "'!='".into(),
258 Token::Lt => "'<'".into(),
259 Token::Gt => "'>'".into(),
260 Token::Lte => "'<='".into(),
261 Token::Gte => "'>='".into(),
262 Token::Assign => "':='".into(),
263 Token::Arrow => "'->'".into(),
264 Token::Pipe => "'|'".into(),
265 Token::Coalesce => "'??'".into(),
266 Token::Plus => "'+'".into(),
267 Token::Minus => "'-'".into(),
268 Token::Star => "'*'".into(),
269 Token::Slash => "'/'".into(),
270
271 Token::LBrace => "'{'".into(),
273 Token::RBrace => "'}'".into(),
274 Token::LParen => "'('".into(),
275 Token::RParen => "')'".into(),
276 Token::Comma => "','".into(),
277 Token::Colon => "':'".into(),
278 Token::Dot => "'.'".into(),
279
280 Token::Eof => "end of input".into(),
281 }
282 }
283}