Skip to main content

surql_parser/
keywords.rs

1use crate::upstream::syn::token::Keyword;
2
3fn keyword_str(k: Keyword) -> &'static str {
4	match k {
5		Keyword::Access => k.as_str(),
6		Keyword::After => k.as_str(),
7		Keyword::Algorithm => k.as_str(),
8		Keyword::All => k.as_str(),
9		Keyword::Alter => k.as_str(),
10		Keyword::Always => k.as_str(),
11		Keyword::Analyzer => k.as_str(),
12		Keyword::Api => k.as_str(),
13		Keyword::As => k.as_str(),
14		Keyword::Ascending => k.as_str(),
15		Keyword::Ascii => k.as_str(),
16		Keyword::Assert => k.as_str(),
17		Keyword::Async => k.as_str(),
18		Keyword::At => k.as_str(),
19		Keyword::Authenticate => k.as_str(),
20		Keyword::Auto => k.as_str(),
21		Keyword::Backend => k.as_str(),
22		Keyword::Batch => k.as_str(),
23		Keyword::Bearer => k.as_str(),
24		Keyword::Before => k.as_str(),
25		Keyword::Begin => k.as_str(),
26		Keyword::Blank => k.as_str(),
27		Keyword::Bucket => k.as_str(),
28		Keyword::Reject => k.as_str(),
29		Keyword::Bm25 => k.as_str(),
30		Keyword::Break => k.as_str(),
31		Keyword::By => k.as_str(),
32		Keyword::Camel => k.as_str(),
33		Keyword::Cancel => k.as_str(),
34		Keyword::Cascade => k.as_str(),
35		Keyword::ChangeFeed => k.as_str(),
36		Keyword::Changes => k.as_str(),
37		Keyword::Capacity => k.as_str(),
38		Keyword::Class => k.as_str(),
39		Keyword::Comment => k.as_str(),
40		Keyword::Commit => k.as_str(),
41		Keyword::Compact => k.as_str(),
42		Keyword::Concurrently => k.as_str(),
43		Keyword::Config => k.as_str(),
44		Keyword::Content => k.as_str(),
45		Keyword::Continue => k.as_str(),
46		Keyword::Computed => k.as_str(),
47		Keyword::Count => k.as_str(),
48		Keyword::Create => k.as_str(),
49		Keyword::Database => k.as_str(),
50		Keyword::Default => k.as_str(),
51		Keyword::Define => k.as_str(),
52		Keyword::Delete => k.as_str(),
53		Keyword::Descending => k.as_str(),
54		Keyword::Diff => k.as_str(),
55		Keyword::Dimension => k.as_str(),
56		Keyword::Distance => k.as_str(),
57		Keyword::Drop => k.as_str(),
58		Keyword::Duplicate => k.as_str(),
59		Keyword::Efc => k.as_str(),
60		Keyword::Edgengram => k.as_str(),
61		Keyword::Event => k.as_str(),
62		Keyword::Else => k.as_str(),
63		Keyword::End => k.as_str(),
64		Keyword::Enforced => k.as_str(),
65		Keyword::Exclude => k.as_str(),
66		Keyword::Exists => k.as_str(),
67		Keyword::Expired => k.as_str(),
68		Keyword::Explain => k.as_str(),
69		Keyword::Expunge => k.as_str(),
70		Keyword::ExtendCandidates => k.as_str(),
71		Keyword::False => k.as_str(),
72		Keyword::Fetch => k.as_str(),
73		Keyword::Field => k.as_str(),
74		Keyword::Fields => k.as_str(),
75		Keyword::Filters => k.as_str(),
76		Keyword::Flexible => k.as_str(),
77		Keyword::For => k.as_str(),
78		Keyword::From => k.as_str(),
79		Keyword::Full => k.as_str(),
80		Keyword::Fulltext => k.as_str(),
81		Keyword::Function => k.as_str(),
82		Keyword::Functions => k.as_str(),
83		Keyword::Grant => k.as_str(),
84		Keyword::Graphql => k.as_str(),
85		Keyword::Group => k.as_str(),
86		Keyword::Headers => k.as_str(),
87		Keyword::Highlights => k.as_str(),
88		Keyword::Hnsw => k.as_str(),
89		Keyword::Ignore => k.as_str(),
90		Keyword::Include => k.as_str(),
91		Keyword::Index => k.as_str(),
92		Keyword::Info => k.as_str(),
93		Keyword::Insert => k.as_str(),
94		Keyword::Into => k.as_str(),
95		Keyword::If => k.as_str(),
96		Keyword::Is => k.as_str(),
97		Keyword::Issuer => k.as_str(),
98		Keyword::Jwt => k.as_str(),
99		Keyword::Jwks => k.as_str(),
100		Keyword::HashedVector => k.as_str(),
101		Keyword::Key => k.as_str(),
102		Keyword::KeepPrunedConnections => k.as_str(),
103		Keyword::Kill => k.as_str(),
104		Keyword::Let => k.as_str(),
105		Keyword::Limit => k.as_str(),
106		Keyword::Live => k.as_str(),
107		Keyword::Lowercase => k.as_str(),
108		Keyword::Lm => k.as_str(),
109		Keyword::M => k.as_str(),
110		Keyword::M0 => k.as_str(),
111		Keyword::Mapper => k.as_str(),
112		Keyword::MaxDepth => k.as_str(),
113		Keyword::Middleware => k.as_str(),
114		Keyword::Merge => k.as_str(),
115		Keyword::Model => k.as_str(),
116		Keyword::Module => k.as_str(),
117		Keyword::Namespace => k.as_str(),
118		Keyword::Ngram => k.as_str(),
119		Keyword::No => k.as_str(),
120		Keyword::NoIndex => k.as_str(),
121		Keyword::None => k.as_str(),
122		Keyword::Null => k.as_str(),
123		Keyword::Numeric => k.as_str(),
124		Keyword::Omit => k.as_str(),
125		Keyword::On => k.as_str(),
126		Keyword::Only => k.as_str(),
127		Keyword::Option => k.as_str(),
128		Keyword::Order => k.as_str(),
129		Keyword::Original => k.as_str(),
130		Keyword::Overwrite => k.as_str(),
131		Keyword::Parallel => k.as_str(),
132		Keyword::Param => k.as_str(),
133		Keyword::Passhash => k.as_str(),
134		Keyword::Password => k.as_str(),
135		Keyword::Patch => k.as_str(),
136		Keyword::Permissions => k.as_str(),
137		Keyword::PostingsCache => k.as_str(),
138		Keyword::PostingsOrder => k.as_str(),
139		Keyword::Prepare => k.as_str(),
140		Keyword::Punct => k.as_str(),
141		Keyword::Purge => k.as_str(),
142		Keyword::Range => k.as_str(),
143		Keyword::Readonly => k.as_str(),
144		Keyword::Rebuild => k.as_str(),
145		Keyword::Reference => k.as_str(),
146		Keyword::Refresh => k.as_str(),
147		Keyword::Regex => k.as_str(),
148		Keyword::Relate => k.as_str(),
149		Keyword::Relation => k.as_str(),
150		Keyword::Remove => k.as_str(),
151		Keyword::Replace => k.as_str(),
152		Keyword::Retry => k.as_str(),
153		Keyword::Return => k.as_str(),
154		Keyword::Revoke => k.as_str(),
155		Keyword::Revoked => k.as_str(),
156		Keyword::Roles => k.as_str(),
157		Keyword::Root => k.as_str(),
158		Keyword::Schemafull => k.as_str(),
159		Keyword::Schemaless => k.as_str(),
160		Keyword::Scope => k.as_str(),
161		Keyword::Select => k.as_str(),
162		Keyword::Sequence => k.as_str(),
163		Keyword::Session => k.as_str(),
164		Keyword::Set => k.as_str(),
165		Keyword::Show => k.as_str(),
166		Keyword::Signin => k.as_str(),
167		Keyword::Signup => k.as_str(),
168		Keyword::Since => k.as_str(),
169		Keyword::Sleep => k.as_str(),
170		Keyword::Snowball => k.as_str(),
171		Keyword::Split => k.as_str(),
172		Keyword::Start => k.as_str(),
173		Keyword::Strict => k.as_str(),
174		Keyword::Structure => k.as_str(),
175		Keyword::System => k.as_str(),
176		Keyword::Table => k.as_str(),
177		Keyword::Tables => k.as_str(),
178		Keyword::TempFiles => k.as_str(),
179		Keyword::TermsCache => k.as_str(),
180		Keyword::TermsOrder => k.as_str(),
181		Keyword::Then => k.as_str(),
182		Keyword::Throw => k.as_str(),
183		Keyword::Timeout => k.as_str(),
184		Keyword::Tokenizers => k.as_str(),
185		Keyword::Token => k.as_str(),
186		Keyword::To => k.as_str(),
187		Keyword::Transaction => k.as_str(),
188		Keyword::True => k.as_str(),
189		Keyword::Type => k.as_str(),
190		Keyword::Unique => k.as_str(),
191		Keyword::Unset => k.as_str(),
192		Keyword::Update => k.as_str(),
193		Keyword::Upsert => k.as_str(),
194		Keyword::Uppercase => k.as_str(),
195		Keyword::Url => k.as_str(),
196		Keyword::Use => k.as_str(),
197		Keyword::User => k.as_str(),
198		Keyword::Value => k.as_str(),
199		Keyword::Values => k.as_str(),
200		Keyword::Version => k.as_str(),
201		Keyword::Vs => k.as_str(),
202		Keyword::When => k.as_str(),
203		Keyword::Where => k.as_str(),
204		Keyword::With => k.as_str(),
205		Keyword::AllInside => k.as_str(),
206		Keyword::AndKw => k.as_str(),
207		Keyword::AnyInside => k.as_str(),
208		Keyword::Inside => k.as_str(),
209		Keyword::Intersects => k.as_str(),
210		Keyword::NoneInside => k.as_str(),
211		Keyword::NotInside => k.as_str(),
212		Keyword::OrKw => k.as_str(),
213		Keyword::Outside => k.as_str(),
214		Keyword::Not => k.as_str(),
215		Keyword::And => k.as_str(),
216		Keyword::Collate => k.as_str(),
217		Keyword::ContainsAll => k.as_str(),
218		Keyword::ContainsAny => k.as_str(),
219		Keyword::ContainsNone => k.as_str(),
220		Keyword::ContainsNot => k.as_str(),
221		Keyword::Contains => k.as_str(),
222		Keyword::In => k.as_str(),
223		Keyword::Out => k.as_str(),
224		Keyword::Normal => k.as_str(),
225		Keyword::Any => k.as_str(),
226		Keyword::Array => k.as_str(),
227		Keyword::Geometry => k.as_str(),
228		Keyword::Record => k.as_str(),
229		Keyword::Bool => k.as_str(),
230		Keyword::Bytes => k.as_str(),
231		Keyword::Datetime => k.as_str(),
232		Keyword::Decimal => k.as_str(),
233		Keyword::Duration => k.as_str(),
234		Keyword::Float => k.as_str(),
235		Keyword::Fn => k.as_str(),
236		Keyword::Silo => k.as_str(),
237		Keyword::Mod => k.as_str(),
238		Keyword::Int => k.as_str(),
239		Keyword::Number => k.as_str(),
240		Keyword::Object => k.as_str(),
241		Keyword::String => k.as_str(),
242		Keyword::Uuid => k.as_str(),
243		Keyword::Ulid => k.as_str(),
244		Keyword::Rand => k.as_str(),
245		Keyword::References => k.as_str(),
246		Keyword::Feature => k.as_str(),
247		Keyword::Line => k.as_str(),
248		Keyword::Point => k.as_str(),
249		Keyword::Polygon => k.as_str(),
250		Keyword::MultiPoint => k.as_str(),
251		Keyword::MultiLine => k.as_str(),
252		Keyword::MultiPolygon => k.as_str(),
253		Keyword::Collection => k.as_str(),
254		Keyword::File => k.as_str(),
255		Keyword::FN => k.as_str(),
256		Keyword::ML => k.as_str(),
257		Keyword::Get => k.as_str(),
258		Keyword::Post => k.as_str(),
259		Keyword::Put => k.as_str(),
260		Keyword::Trace => k.as_str(),
261	}
262}
263
264/// All SurrealQL keywords recognized by the parser.
265///
266/// Built from the parser's `Keyword` enum via an exhaustive match.
267/// Adding a variant to `Keyword` without adding it here causes a
268/// compile error (missing match arm).
269pub fn all_keywords() -> &'static [&'static str] {
270	use std::sync::LazyLock;
271
272	static KEYWORDS: LazyLock<Vec<&'static str>> = LazyLock::new(|| {
273		use Keyword::*;
274		let variants = [
275			Access,
276			After,
277			Algorithm,
278			All,
279			Alter,
280			Always,
281			Analyzer,
282			Api,
283			As,
284			Ascending,
285			Ascii,
286			Assert,
287			Async,
288			At,
289			Authenticate,
290			Auto,
291			Backend,
292			Batch,
293			Bearer,
294			Before,
295			Begin,
296			Blank,
297			Bucket,
298			Reject,
299			Bm25,
300			Break,
301			By,
302			Camel,
303			Cancel,
304			Cascade,
305			ChangeFeed,
306			Changes,
307			Capacity,
308			Class,
309			Comment,
310			Commit,
311			Compact,
312			Concurrently,
313			Config,
314			Content,
315			Continue,
316			Computed,
317			Count,
318			Create,
319			Database,
320			Default,
321			Define,
322			Delete,
323			Descending,
324			Diff,
325			Dimension,
326			Distance,
327			Drop,
328			Duplicate,
329			Efc,
330			Edgengram,
331			Event,
332			Else,
333			End,
334			Enforced,
335			Exclude,
336			Exists,
337			Expired,
338			Explain,
339			Expunge,
340			ExtendCandidates,
341			False,
342			Fetch,
343			Field,
344			Fields,
345			Filters,
346			Flexible,
347			For,
348			From,
349			Full,
350			Fulltext,
351			Function,
352			Functions,
353			Grant,
354			Graphql,
355			Group,
356			Headers,
357			Highlights,
358			Hnsw,
359			Ignore,
360			Include,
361			Index,
362			Info,
363			Insert,
364			Into,
365			If,
366			Is,
367			Issuer,
368			Jwt,
369			Jwks,
370			HashedVector,
371			Key,
372			KeepPrunedConnections,
373			Kill,
374			Let,
375			Limit,
376			Live,
377			Lowercase,
378			Lm,
379			M,
380			M0,
381			Mapper,
382			MaxDepth,
383			Middleware,
384			Merge,
385			Model,
386			Module,
387			Namespace,
388			Ngram,
389			No,
390			NoIndex,
391			None,
392			Null,
393			Numeric,
394			Omit,
395			On,
396			Only,
397			Option,
398			Order,
399			Original,
400			Overwrite,
401			Parallel,
402			Param,
403			Passhash,
404			Password,
405			Patch,
406			Permissions,
407			PostingsCache,
408			PostingsOrder,
409			Prepare,
410			Punct,
411			Purge,
412			Range,
413			Readonly,
414			Rebuild,
415			Reference,
416			Refresh,
417			Regex,
418			Relate,
419			Relation,
420			Remove,
421			Replace,
422			Retry,
423			Return,
424			Revoke,
425			Revoked,
426			Roles,
427			Root,
428			Schemafull,
429			Schemaless,
430			Scope,
431			Select,
432			Sequence,
433			Session,
434			Set,
435			Show,
436			Signin,
437			Signup,
438			Since,
439			Sleep,
440			Snowball,
441			Split,
442			Start,
443			Strict,
444			Structure,
445			System,
446			Table,
447			Tables,
448			TempFiles,
449			TermsCache,
450			TermsOrder,
451			Then,
452			Throw,
453			Timeout,
454			Tokenizers,
455			Token,
456			To,
457			Transaction,
458			True,
459			Type,
460			Unique,
461			Unset,
462			Update,
463			Upsert,
464			Uppercase,
465			Url,
466			Use,
467			User,
468			Value,
469			Values,
470			Version,
471			Vs,
472			When,
473			Where,
474			With,
475			AllInside,
476			AndKw,
477			AnyInside,
478			Inside,
479			Intersects,
480			NoneInside,
481			NotInside,
482			OrKw,
483			Outside,
484			Not,
485			And,
486			Collate,
487			ContainsAll,
488			ContainsAny,
489			ContainsNone,
490			ContainsNot,
491			Contains,
492			In,
493			Out,
494			Normal,
495			Any,
496			Array,
497			Geometry,
498			Record,
499			Bool,
500			Bytes,
501			Datetime,
502			Decimal,
503			Duration,
504			Float,
505			Fn,
506			Silo,
507			Mod,
508			Int,
509			Number,
510			Object,
511			String,
512			Uuid,
513			Ulid,
514			Rand,
515			References,
516			Feature,
517			Line,
518			Point,
519			Polygon,
520			MultiPoint,
521			MultiLine,
522			MultiPolygon,
523			Collection,
524			File,
525			FN,
526			ML,
527			Get,
528			Post,
529			Put,
530			Trace,
531		];
532		let mut kws: Vec<&str> = variants.iter().map(|k| keyword_str(*k)).collect();
533		kws.sort();
534		kws.dedup();
535		kws
536	});
537	&KEYWORDS
538}