Skip to main content

cyrs_ast/
generated.rs

1// @generated by `cargo xtask codegen`. DO NOT EDIT.
2// Source: crates/cyrs-ast/cypher.ungrammar (spec 0001 §5.2).
3//
4// Typed AST wrappers are zero-cost views over `cyrs_syntax::SyntaxNode`
5// (spec §5.1). Each struct wrapper has a `cast` that succeeds iff the
6// underlying node's `SyntaxKind` matches, plus `Option`-returning
7// accessors per child (spec §5.3). Sum-type enum wrappers cover
8// alternation-only productions (spec §5.4) and cast by cascading into
9// their variants — first successful arm cast wins.
10//
11// SKIPPED (no wrapper emitted — productions listed below):
12//   - SingleQuery: no `SyntaxKind::SINGLE_QUERY` variant in cyrs-syntax::kind (see cy-nom follow-ups)
13//   - Union: no `SyntaxKind::UNION` variant in cyrs-syntax::kind (see cy-nom follow-ups)
14//   - ReturnItems: alternation contains a sequence arm (not a single-node shape)
15//   - Skip: no `SyntaxKind::SKIP` variant in cyrs-syntax::kind (see cy-nom follow-ups)
16//   - Limit: no `SyntaxKind::LIMIT` variant in cyrs-syntax::kind (see cy-nom follow-ups)
17//   - NameDef: alternation contains a token arm (sum-type-over-tokens emitter not in cy-pbx scope)
18//   - QualifiedName: no `SyntaxKind::QUALIFIED_NAME` variant in cyrs-syntax::kind (see cy-nom follow-ups)
19//   - YieldClause: no `SyntaxKind::YIELD_CLAUSE` variant in cyrs-syntax::kind (see cy-nom follow-ups)
20//   - SortItem: no `SyntaxKind::SORT_ITEM` variant in cyrs-syntax::kind (see cy-nom follow-ups)
21//   - NameRef: alternation contains a token arm (sum-type-over-tokens emitter not in cy-pbx scope)
22//   - PropertyAssign: no `SyntaxKind::PROPERTY_ASSIGN` variant in cyrs-syntax::kind (see cy-nom follow-ups)
23//   - LabelAdd: no `SyntaxKind::LABEL_ADD` variant in cyrs-syntax::kind (see cy-nom follow-ups)
24//   - NodeReplace: no `SyntaxKind::NODE_REPLACE` variant in cyrs-syntax::kind (see cy-nom follow-ups)
25//   - NodeMerge: no `SyntaxKind::NODE_MERGE` variant in cyrs-syntax::kind (see cy-nom follow-ups)
26//   - PropertyAccess: no `SyntaxKind::PROPERTY_ACCESS` variant in cyrs-syntax::kind (see cy-nom follow-ups)
27//   - PropertyRemove: no `SyntaxKind::PROPERTY_REMOVE` variant in cyrs-syntax::kind (see cy-nom follow-ups)
28//   - LabelRemove: no `SyntaxKind::LABEL_REMOVE` variant in cyrs-syntax::kind (see cy-nom follow-ups)
29//   - PathPattern: alternation contains a sequence arm (not a single-node shape)
30//   - PathElement: no `SyntaxKind::PATH_ELEMENT` variant in cyrs-syntax::kind (see cy-nom follow-ups)
31//   - RelPattern: alternation contains a sequence arm (not a single-node shape)
32//   - TypeExpr: no `SyntaxKind::TYPE_EXPR` variant in cyrs-syntax::kind (see cy-nom follow-ups)
33//   - RangeHops: alternation contains a sequence arm (not a single-node shape)
34//   - IntLiteral: no `SyntaxKind::INT_LITERAL` variant in cyrs-syntax::kind (see cy-nom follow-ups)
35//   - Label: no `SyntaxKind::LABEL` variant in cyrs-syntax::kind (see cy-nom follow-ups)
36//   - RelType: no `SyntaxKind::REL_TYPE` variant in cyrs-syntax::kind (see cy-nom follow-ups)
37//   - PropertyKV: no `SyntaxKind::PROPERTY_K_V` variant in cyrs-syntax::kind (see cy-nom follow-ups)
38//   - PropertyKey: alternation contains a token arm (sum-type-over-tokens emitter not in cy-pbx scope)
39//   - ParameterExpr: no `SyntaxKind::PARAMETER_EXPR` variant in cyrs-syntax::kind (see cy-nom follow-ups)
40//   - VariableRef: no `SyntaxKind::VARIABLE_REF` variant in cyrs-syntax::kind (see cy-nom follow-ups)
41//   - IndexAccess: no `SyntaxKind::INDEX_ACCESS` variant in cyrs-syntax::kind (see cy-nom follow-ups)
42//   - CountStar: no `SyntaxKind::COUNT_STAR` variant in cyrs-syntax::kind (see cy-nom follow-ups)
43//   - NullCheck: no `SyntaxKind::NULL_CHECK` variant in cyrs-syntax::kind (see cy-nom follow-ups)
44//   - ExistsPredicate: no `SyntaxKind::EXISTS_PREDICATE` variant in cyrs-syntax::kind (see cy-nom follow-ups)
45//   - StringPatternExpr: no `SyntaxKind::STRING_PATTERN_EXPR` variant in cyrs-syntax::kind (see cy-nom follow-ups)
46//   - MembershipExpr: no `SyntaxKind::MEMBERSHIP_EXPR` variant in cyrs-syntax::kind (see cy-nom follow-ups)
47//   - FloatLiteral: no `SyntaxKind::FLOAT_LITERAL` variant in cyrs-syntax::kind (see cy-nom follow-ups)
48//   - StringLiteral: no `SyntaxKind::STRING_LITERAL` variant in cyrs-syntax::kind (see cy-nom follow-ups)
49//   - BoolLiteral: alternation contains a token arm (sum-type-over-tokens emitter not in cy-pbx scope)
50//   - NullLiteral: no `SyntaxKind::NULL_LITERAL` variant in cyrs-syntax::kind (see cy-nom follow-ups)
51//   - MapProjectionItem: alternation contains a sequence arm (not a single-node shape)
52//   - BinaryOp: alternation contains a token arm (sum-type-over-tokens emitter not in cy-pbx scope)
53//   - UnaryOp: alternation contains a token arm (sum-type-over-tokens emitter not in cy-pbx scope)
54//   - StringPatternOp: alternation contains a token arm (sum-type-over-tokens emitter not in cy-pbx scope)
55//   - Statement: alternation arms all reference types that aren't emitted yet (will light up as `SyntaxKind` variants land)
56//   - SetItem: alternation arms all reference types that aren't emitted yet (will light up as `SyntaxKind` variants land)
57//   - RemoveItem: alternation arms all reference types that aren't emitted yet (will light up as `SyntaxKind` variants land)
58//   - Literal: alternation arms all reference types that aren't emitted yet (will light up as `SyntaxKind` variants land)
59
60#![forbid(unsafe_code)]
61#![allow(clippy::wildcard_imports)]
62#![allow(clippy::return_self_not_must_use)]
63#![allow(dead_code)]
64#![allow(missing_docs)]
65
66use cyrs_syntax::{SyntaxElement, SyntaxKind, SyntaxNode, SyntaxToken};
67
68#[derive(Debug, Clone, PartialEq, Eq, Hash)]
69pub struct SourceFile {
70    syntax: SyntaxNode,
71}
72
73impl SourceFile {
74    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
75        (syntax.kind() == SyntaxKind::SOURCE_FILE).then_some(Self { syntax })
76    }
77
78    pub fn syntax(&self) -> &SyntaxNode {
79        &self.syntax
80    }
81}
82
83#[derive(Debug, Clone, PartialEq, Eq, Hash)]
84pub struct UnionTail {
85    syntax: SyntaxNode,
86}
87
88impl UnionTail {
89    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
90        (syntax.kind() == SyntaxKind::UNION_TAIL).then_some(Self { syntax })
91    }
92
93    pub fn syntax(&self) -> &SyntaxNode {
94        &self.syntax
95    }
96
97    pub fn union_token(&self) -> Option<SyntaxToken> {
98        self.syntax
99            .children_with_tokens()
100            .filter_map(SyntaxElement::into_token)
101            .find(|t| t.kind() == SyntaxKind::UNION_KW)
102    }
103
104    pub fn all_token(&self) -> Option<SyntaxToken> {
105        self.syntax
106            .children_with_tokens()
107            .filter_map(SyntaxElement::into_token)
108            .find(|t| t.kind() == SyntaxKind::ALL_KW)
109    }
110}
111
112#[derive(Debug, Clone, PartialEq, Eq, Hash)]
113pub struct MatchClause {
114    syntax: SyntaxNode,
115}
116
117impl MatchClause {
118    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
119        (syntax.kind() == SyntaxKind::MATCH_CLAUSE).then_some(Self { syntax })
120    }
121
122    pub fn syntax(&self) -> &SyntaxNode {
123        &self.syntax
124    }
125
126    pub fn pattern(&self) -> impl Iterator<Item = Pattern> + '_ {
127        self.syntax.children().filter_map(Pattern::cast)
128    }
129
130    pub fn where_clause(&self) -> Option<WhereClause> {
131        self.syntax.children().find_map(WhereClause::cast)
132    }
133
134    pub fn optional_token(&self) -> Option<SyntaxToken> {
135        self.syntax
136            .children_with_tokens()
137            .filter_map(SyntaxElement::into_token)
138            .find(|t| t.kind() == SyntaxKind::OPTIONAL_KW)
139    }
140
141    pub fn match_token(&self) -> Option<SyntaxToken> {
142        self.syntax
143            .children_with_tokens()
144            .filter_map(SyntaxElement::into_token)
145            .find(|t| t.kind() == SyntaxKind::MATCH_KW)
146    }
147}
148
149#[derive(Debug, Clone, PartialEq, Eq, Hash)]
150pub struct WithClause {
151    syntax: SyntaxNode,
152}
153
154impl WithClause {
155    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
156        (syntax.kind() == SyntaxKind::WITH_CLAUSE).then_some(Self { syntax })
157    }
158
159    pub fn syntax(&self) -> &SyntaxNode {
160        &self.syntax
161    }
162
163    pub fn where_clause(&self) -> Option<WhereClause> {
164        self.syntax.children().find_map(WhereClause::cast)
165    }
166
167    pub fn order_by(&self) -> Option<OrderBy> {
168        self.syntax.children().find_map(OrderBy::cast)
169    }
170
171    pub fn with_token(&self) -> Option<SyntaxToken> {
172        self.syntax
173            .children_with_tokens()
174            .filter_map(SyntaxElement::into_token)
175            .find(|t| t.kind() == SyntaxKind::WITH_KW)
176    }
177
178    pub fn distinct_token(&self) -> Option<SyntaxToken> {
179        self.syntax
180            .children_with_tokens()
181            .filter_map(SyntaxElement::into_token)
182            .find(|t| t.kind() == SyntaxKind::DISTINCT_KW)
183    }
184}
185
186#[derive(Debug, Clone, PartialEq, Eq, Hash)]
187pub struct ReturnClause {
188    syntax: SyntaxNode,
189}
190
191impl ReturnClause {
192    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
193        (syntax.kind() == SyntaxKind::RETURN_CLAUSE).then_some(Self { syntax })
194    }
195
196    pub fn syntax(&self) -> &SyntaxNode {
197        &self.syntax
198    }
199
200    pub fn order_by(&self) -> Option<OrderBy> {
201        self.syntax.children().find_map(OrderBy::cast)
202    }
203
204    pub fn return_token(&self) -> Option<SyntaxToken> {
205        self.syntax
206            .children_with_tokens()
207            .filter_map(SyntaxElement::into_token)
208            .find(|t| t.kind() == SyntaxKind::RETURN_KW)
209    }
210
211    pub fn distinct_token(&self) -> Option<SyntaxToken> {
212        self.syntax
213            .children_with_tokens()
214            .filter_map(SyntaxElement::into_token)
215            .find(|t| t.kind() == SyntaxKind::DISTINCT_KW)
216    }
217}
218
219#[derive(Debug, Clone, PartialEq, Eq, Hash)]
220pub struct UnwindClause {
221    syntax: SyntaxNode,
222}
223
224impl UnwindClause {
225    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
226        (syntax.kind() == SyntaxKind::UNWIND_CLAUSE).then_some(Self { syntax })
227    }
228
229    pub fn syntax(&self) -> &SyntaxNode {
230        &self.syntax
231    }
232
233    pub fn expr(&self) -> Option<Expr> {
234        self.syntax.children().find_map(Expr::cast)
235    }
236
237    pub fn unwind_token(&self) -> Option<SyntaxToken> {
238        self.syntax
239            .children_with_tokens()
240            .filter_map(SyntaxElement::into_token)
241            .find(|t| t.kind() == SyntaxKind::UNWIND_KW)
242    }
243
244    pub fn as_token(&self) -> Option<SyntaxToken> {
245        self.syntax
246            .children_with_tokens()
247            .filter_map(SyntaxElement::into_token)
248            .find(|t| t.kind() == SyntaxKind::AS_KW)
249    }
250}
251
252#[derive(Debug, Clone, PartialEq, Eq, Hash)]
253pub struct CallClause {
254    syntax: SyntaxNode,
255}
256
257impl CallClause {
258    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
259        (syntax.kind() == SyntaxKind::CALL_CLAUSE).then_some(Self { syntax })
260    }
261
262    pub fn syntax(&self) -> &SyntaxNode {
263        &self.syntax
264    }
265
266    pub fn arg_list(&self) -> Option<ArgList> {
267        self.syntax.children().find_map(ArgList::cast)
268    }
269
270    pub fn call_token(&self) -> Option<SyntaxToken> {
271        self.syntax
272            .children_with_tokens()
273            .filter_map(SyntaxElement::into_token)
274            .find(|t| t.kind() == SyntaxKind::CALL_KW)
275    }
276}
277
278#[derive(Debug, Clone, PartialEq, Eq, Hash)]
279pub struct CreateClause {
280    syntax: SyntaxNode,
281}
282
283impl CreateClause {
284    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
285        (syntax.kind() == SyntaxKind::CREATE_CLAUSE).then_some(Self { syntax })
286    }
287
288    pub fn syntax(&self) -> &SyntaxNode {
289        &self.syntax
290    }
291
292    pub fn pattern(&self) -> impl Iterator<Item = Pattern> + '_ {
293        self.syntax.children().filter_map(Pattern::cast)
294    }
295
296    pub fn create_token(&self) -> Option<SyntaxToken> {
297        self.syntax
298            .children_with_tokens()
299            .filter_map(SyntaxElement::into_token)
300            .find(|t| t.kind() == SyntaxKind::CREATE_KW)
301    }
302}
303
304#[derive(Debug, Clone, PartialEq, Eq, Hash)]
305pub struct MergeClause {
306    syntax: SyntaxNode,
307}
308
309impl MergeClause {
310    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
311        (syntax.kind() == SyntaxKind::MERGE_CLAUSE).then_some(Self { syntax })
312    }
313
314    pub fn syntax(&self) -> &SyntaxNode {
315        &self.syntax
316    }
317
318    pub fn pattern(&self) -> Option<Pattern> {
319        self.syntax.children().find_map(Pattern::cast)
320    }
321
322    pub fn merge_action(&self) -> impl Iterator<Item = MergeAction> + '_ {
323        self.syntax.children().filter_map(MergeAction::cast)
324    }
325
326    pub fn merge_token(&self) -> Option<SyntaxToken> {
327        self.syntax
328            .children_with_tokens()
329            .filter_map(SyntaxElement::into_token)
330            .find(|t| t.kind() == SyntaxKind::MERGE_KW)
331    }
332}
333
334#[derive(Debug, Clone, PartialEq, Eq, Hash)]
335pub struct SetClause {
336    syntax: SyntaxNode,
337}
338
339impl SetClause {
340    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
341        (syntax.kind() == SyntaxKind::SET_CLAUSE).then_some(Self { syntax })
342    }
343
344    pub fn syntax(&self) -> &SyntaxNode {
345        &self.syntax
346    }
347
348    pub fn set_token(&self) -> Option<SyntaxToken> {
349        self.syntax
350            .children_with_tokens()
351            .filter_map(SyntaxElement::into_token)
352            .find(|t| t.kind() == SyntaxKind::SET_KW)
353    }
354}
355
356#[derive(Debug, Clone, PartialEq, Eq, Hash)]
357pub struct RemoveClause {
358    syntax: SyntaxNode,
359}
360
361impl RemoveClause {
362    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
363        (syntax.kind() == SyntaxKind::REMOVE_CLAUSE).then_some(Self { syntax })
364    }
365
366    pub fn syntax(&self) -> &SyntaxNode {
367        &self.syntax
368    }
369
370    pub fn remove_token(&self) -> Option<SyntaxToken> {
371        self.syntax
372            .children_with_tokens()
373            .filter_map(SyntaxElement::into_token)
374            .find(|t| t.kind() == SyntaxKind::REMOVE_KW)
375    }
376}
377
378#[derive(Debug, Clone, PartialEq, Eq, Hash)]
379pub struct DeleteClause {
380    syntax: SyntaxNode,
381}
382
383impl DeleteClause {
384    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
385        (syntax.kind() == SyntaxKind::DELETE_CLAUSE).then_some(Self { syntax })
386    }
387
388    pub fn syntax(&self) -> &SyntaxNode {
389        &self.syntax
390    }
391
392    pub fn expr(&self) -> impl Iterator<Item = Expr> + '_ {
393        self.syntax.children().filter_map(Expr::cast)
394    }
395
396    pub fn detach_token(&self) -> Option<SyntaxToken> {
397        self.syntax
398            .children_with_tokens()
399            .filter_map(SyntaxElement::into_token)
400            .find(|t| t.kind() == SyntaxKind::DETACH_KW)
401    }
402
403    pub fn delete_token(&self) -> Option<SyntaxToken> {
404        self.syntax
405            .children_with_tokens()
406            .filter_map(SyntaxElement::into_token)
407            .find(|t| t.kind() == SyntaxKind::DELETE_KW)
408    }
409}
410
411#[derive(Debug, Clone, PartialEq, Eq, Hash)]
412pub struct Pattern {
413    syntax: SyntaxNode,
414}
415
416impl Pattern {
417    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
418        (syntax.kind() == SyntaxKind::PATTERN).then_some(Self { syntax })
419    }
420
421    pub fn syntax(&self) -> &SyntaxNode {
422        &self.syntax
423    }
424}
425
426#[derive(Debug, Clone, PartialEq, Eq, Hash)]
427pub struct WhereClause {
428    syntax: SyntaxNode,
429}
430
431impl WhereClause {
432    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
433        (syntax.kind() == SyntaxKind::WHERE_CLAUSE).then_some(Self { syntax })
434    }
435
436    pub fn syntax(&self) -> &SyntaxNode {
437        &self.syntax
438    }
439
440    pub fn expr(&self) -> Option<Expr> {
441        self.syntax.children().find_map(Expr::cast)
442    }
443
444    pub fn where_token(&self) -> Option<SyntaxToken> {
445        self.syntax
446            .children_with_tokens()
447            .filter_map(SyntaxElement::into_token)
448            .find(|t| t.kind() == SyntaxKind::WHERE_KW)
449    }
450}
451
452#[derive(Debug, Clone, PartialEq, Eq, Hash)]
453pub struct OrderBy {
454    syntax: SyntaxNode,
455}
456
457impl OrderBy {
458    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
459        (syntax.kind() == SyntaxKind::ORDER_BY).then_some(Self { syntax })
460    }
461
462    pub fn syntax(&self) -> &SyntaxNode {
463        &self.syntax
464    }
465
466    pub fn order_token(&self) -> Option<SyntaxToken> {
467        self.syntax
468            .children_with_tokens()
469            .filter_map(SyntaxElement::into_token)
470            .find(|t| t.kind() == SyntaxKind::ORDER_KW)
471    }
472
473    pub fn by_token(&self) -> Option<SyntaxToken> {
474        self.syntax
475            .children_with_tokens()
476            .filter_map(SyntaxElement::into_token)
477            .find(|t| t.kind() == SyntaxKind::BY_KW)
478    }
479}
480
481#[derive(Debug, Clone, PartialEq, Eq, Hash)]
482pub struct ArgList {
483    syntax: SyntaxNode,
484}
485
486impl ArgList {
487    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
488        (syntax.kind() == SyntaxKind::ARG_LIST).then_some(Self { syntax })
489    }
490
491    pub fn syntax(&self) -> &SyntaxNode {
492        &self.syntax
493    }
494
495    pub fn expr(&self) -> impl Iterator<Item = Expr> + '_ {
496        self.syntax.children().filter_map(Expr::cast)
497    }
498}
499
500#[derive(Debug, Clone, PartialEq, Eq, Hash)]
501pub struct YieldItem {
502    syntax: SyntaxNode,
503}
504
505impl YieldItem {
506    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
507        (syntax.kind() == SyntaxKind::YIELD_ITEM).then_some(Self { syntax })
508    }
509
510    pub fn syntax(&self) -> &SyntaxNode {
511        &self.syntax
512    }
513
514    pub fn as_token(&self) -> Option<SyntaxToken> {
515        self.syntax
516            .children_with_tokens()
517            .filter_map(SyntaxElement::into_token)
518            .find(|t| t.kind() == SyntaxKind::AS_KW)
519    }
520}
521
522#[derive(Debug, Clone, PartialEq, Eq, Hash)]
523pub struct MergeAction {
524    syntax: SyntaxNode,
525}
526
527impl MergeAction {
528    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
529        (syntax.kind() == SyntaxKind::MERGE_ACTION).then_some(Self { syntax })
530    }
531
532    pub fn syntax(&self) -> &SyntaxNode {
533        &self.syntax
534    }
535
536    pub fn set_clause(&self) -> Option<SetClause> {
537        self.syntax.children().find_map(SetClause::cast)
538    }
539
540    pub fn on_token(&self) -> Option<SyntaxToken> {
541        self.syntax
542            .children_with_tokens()
543            .filter_map(SyntaxElement::into_token)
544            .find(|t| t.kind() == SyntaxKind::ON_KW)
545    }
546
547    pub fn create_token(&self) -> Option<SyntaxToken> {
548        self.syntax
549            .children_with_tokens()
550            .filter_map(SyntaxElement::into_token)
551            .find(|t| t.kind() == SyntaxKind::CREATE_KW)
552    }
553
554    pub fn match_token(&self) -> Option<SyntaxToken> {
555        self.syntax
556            .children_with_tokens()
557            .filter_map(SyntaxElement::into_token)
558            .find(|t| t.kind() == SyntaxKind::MATCH_KW)
559    }
560}
561
562#[derive(Debug, Clone, PartialEq, Eq, Hash)]
563pub struct ReturnItem {
564    syntax: SyntaxNode,
565}
566
567impl ReturnItem {
568    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
569        (syntax.kind() == SyntaxKind::RETURN_ITEM).then_some(Self { syntax })
570    }
571
572    pub fn syntax(&self) -> &SyntaxNode {
573        &self.syntax
574    }
575
576    pub fn expr(&self) -> Option<Expr> {
577        self.syntax.children().find_map(Expr::cast)
578    }
579
580    pub fn as_token(&self) -> Option<SyntaxToken> {
581        self.syntax
582            .children_with_tokens()
583            .filter_map(SyntaxElement::into_token)
584            .find(|t| t.kind() == SyntaxKind::AS_KW)
585    }
586}
587
588#[derive(Debug, Clone, PartialEq, Eq, Hash)]
589pub struct LabelExpr {
590    syntax: SyntaxNode,
591}
592
593impl LabelExpr {
594    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
595        (syntax.kind() == SyntaxKind::LABEL_EXPR).then_some(Self { syntax })
596    }
597
598    pub fn syntax(&self) -> &SyntaxNode {
599        &self.syntax
600    }
601}
602
603#[derive(Debug, Clone, PartialEq, Eq, Hash)]
604pub struct ShortestPathPattern {
605    syntax: SyntaxNode,
606}
607
608impl ShortestPathPattern {
609    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
610        (syntax.kind() == SyntaxKind::SHORTEST_PATH_PATTERN).then_some(Self { syntax })
611    }
612
613    pub fn syntax(&self) -> &SyntaxNode {
614        &self.syntax
615    }
616
617    pub fn shortestpath_token(&self) -> Option<SyntaxToken> {
618        self.syntax
619            .children_with_tokens()
620            .filter_map(SyntaxElement::into_token)
621            .find(|t| t.kind() == SyntaxKind::SHORTESTPATH_KW)
622    }
623
624    pub fn allshortestpaths_token(&self) -> Option<SyntaxToken> {
625        self.syntax
626            .children_with_tokens()
627            .filter_map(SyntaxElement::into_token)
628            .find(|t| t.kind() == SyntaxKind::ALLSHORTESTPATHS_KW)
629    }
630}
631
632#[derive(Debug, Clone, PartialEq, Eq, Hash)]
633pub struct NodePattern {
634    syntax: SyntaxNode,
635}
636
637impl NodePattern {
638    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
639        (syntax.kind() == SyntaxKind::NODE_PATTERN).then_some(Self { syntax })
640    }
641
642    pub fn syntax(&self) -> &SyntaxNode {
643        &self.syntax
644    }
645
646    pub fn label_expr(&self) -> Option<LabelExpr> {
647        self.syntax.children().find_map(LabelExpr::cast)
648    }
649
650    pub fn property_map(&self) -> Option<PropertyMap> {
651        self.syntax.children().find_map(PropertyMap::cast)
652    }
653}
654
655#[derive(Debug, Clone, PartialEq, Eq, Hash)]
656pub struct PropertyMap {
657    syntax: SyntaxNode,
658}
659
660impl PropertyMap {
661    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
662        (syntax.kind() == SyntaxKind::PROPERTY_MAP).then_some(Self { syntax })
663    }
664
665    pub fn syntax(&self) -> &SyntaxNode {
666        &self.syntax
667    }
668}
669
670#[derive(Debug, Clone, PartialEq, Eq, Hash)]
671pub struct RelDetail {
672    syntax: SyntaxNode,
673}
674
675impl RelDetail {
676    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
677        (syntax.kind() == SyntaxKind::REL_DETAIL).then_some(Self { syntax })
678    }
679
680    pub fn syntax(&self) -> &SyntaxNode {
681        &self.syntax
682    }
683
684    pub fn property_map(&self) -> Option<PropertyMap> {
685        self.syntax.children().find_map(PropertyMap::cast)
686    }
687}
688
689#[derive(Debug, Clone, PartialEq, Eq, Hash)]
690pub struct IndexExpr {
691    syntax: SyntaxNode,
692}
693
694impl IndexExpr {
695    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
696        (syntax.kind() == SyntaxKind::INDEX_EXPR).then_some(Self { syntax })
697    }
698
699    pub fn syntax(&self) -> &SyntaxNode {
700        &self.syntax
701    }
702
703    pub fn receiver(&self) -> Option<Expr> {
704        self.syntax.children().find_map(Expr::cast)
705    }
706
707    pub fn index(&self) -> Option<Expr> {
708        self.syntax.children().find_map(Expr::cast)
709    }
710}
711
712#[derive(Debug, Clone, PartialEq, Eq, Hash)]
713pub struct SliceExpr {
714    syntax: SyntaxNode,
715}
716
717impl SliceExpr {
718    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
719        (syntax.kind() == SyntaxKind::SLICE_EXPR).then_some(Self { syntax })
720    }
721
722    pub fn syntax(&self) -> &SyntaxNode {
723        &self.syntax
724    }
725
726    pub fn receiver(&self) -> Option<Expr> {
727        self.syntax.children().find_map(Expr::cast)
728    }
729
730    pub fn start(&self) -> Option<Expr> {
731        self.syntax.children().find_map(Expr::cast)
732    }
733
734    pub fn end(&self) -> Option<Expr> {
735        self.syntax.children().find_map(Expr::cast)
736    }
737}
738
739#[derive(Debug, Clone, PartialEq, Eq, Hash)]
740pub struct FunctionCall {
741    syntax: SyntaxNode,
742}
743
744impl FunctionCall {
745    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
746        (syntax.kind() == SyntaxKind::FUNCTION_CALL).then_some(Self { syntax })
747    }
748
749    pub fn syntax(&self) -> &SyntaxNode {
750        &self.syntax
751    }
752
753    pub fn arg_list(&self) -> Option<ArgList> {
754        self.syntax.children().find_map(ArgList::cast)
755    }
756
757    pub fn distinct_token(&self) -> Option<SyntaxToken> {
758        self.syntax
759            .children_with_tokens()
760            .filter_map(SyntaxElement::into_token)
761            .find(|t| t.kind() == SyntaxKind::DISTINCT_KW)
762    }
763}
764
765#[derive(Debug, Clone, PartialEq, Eq, Hash)]
766pub struct ParenExpr {
767    syntax: SyntaxNode,
768}
769
770impl ParenExpr {
771    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
772        (syntax.kind() == SyntaxKind::PAREN_EXPR).then_some(Self { syntax })
773    }
774
775    pub fn syntax(&self) -> &SyntaxNode {
776        &self.syntax
777    }
778
779    pub fn expr(&self) -> Option<Expr> {
780        self.syntax.children().find_map(Expr::cast)
781    }
782}
783
784#[derive(Debug, Clone, PartialEq, Eq, Hash)]
785pub struct ListLiteral {
786    syntax: SyntaxNode,
787}
788
789impl ListLiteral {
790    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
791        (syntax.kind() == SyntaxKind::LIST_LITERAL).then_some(Self { syntax })
792    }
793
794    pub fn syntax(&self) -> &SyntaxNode {
795        &self.syntax
796    }
797
798    pub fn expr(&self) -> impl Iterator<Item = Expr> + '_ {
799        self.syntax.children().filter_map(Expr::cast)
800    }
801}
802
803#[derive(Debug, Clone, PartialEq, Eq, Hash)]
804pub struct MapLiteral {
805    syntax: SyntaxNode,
806}
807
808impl MapLiteral {
809    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
810        (syntax.kind() == SyntaxKind::MAP_LITERAL).then_some(Self { syntax })
811    }
812
813    pub fn syntax(&self) -> &SyntaxNode {
814        &self.syntax
815    }
816}
817
818#[derive(Debug, Clone, PartialEq, Eq, Hash)]
819pub struct MapProjection {
820    syntax: SyntaxNode,
821}
822
823impl MapProjection {
824    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
825        (syntax.kind() == SyntaxKind::MAP_PROJECTION).then_some(Self { syntax })
826    }
827
828    pub fn syntax(&self) -> &SyntaxNode {
829        &self.syntax
830    }
831
832    pub fn subject(&self) -> Option<Expr> {
833        self.syntax.children().find_map(Expr::cast)
834    }
835}
836
837#[derive(Debug, Clone, PartialEq, Eq, Hash)]
838pub struct ListComprehension {
839    syntax: SyntaxNode,
840}
841
842impl ListComprehension {
843    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
844        (syntax.kind() == SyntaxKind::LIST_COMPREHENSION).then_some(Self { syntax })
845    }
846
847    pub fn syntax(&self) -> &SyntaxNode {
848        &self.syntax
849    }
850
851    pub fn source(&self) -> Option<Expr> {
852        self.syntax.children().find_map(Expr::cast)
853    }
854
855    pub fn where_clause(&self) -> Option<WhereClause> {
856        self.syntax.children().find_map(WhereClause::cast)
857    }
858
859    pub fn projection(&self) -> Option<Expr> {
860        self.syntax.children().find_map(Expr::cast)
861    }
862
863    pub fn in_token(&self) -> Option<SyntaxToken> {
864        self.syntax
865            .children_with_tokens()
866            .filter_map(SyntaxElement::into_token)
867            .find(|t| t.kind() == SyntaxKind::IN_KW)
868    }
869}
870
871#[derive(Debug, Clone, PartialEq, Eq, Hash)]
872pub struct ListPredicateExpr {
873    syntax: SyntaxNode,
874}
875
876impl ListPredicateExpr {
877    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
878        (syntax.kind() == SyntaxKind::LIST_PREDICATE_EXPR).then_some(Self { syntax })
879    }
880
881    pub fn syntax(&self) -> &SyntaxNode {
882        &self.syntax
883    }
884
885    pub fn source(&self) -> Option<Expr> {
886        self.syntax.children().find_map(Expr::cast)
887    }
888
889    pub fn where_clause(&self) -> Option<WhereClause> {
890        self.syntax.children().find_map(WhereClause::cast)
891    }
892
893    pub fn any_token(&self) -> Option<SyntaxToken> {
894        self.syntax
895            .children_with_tokens()
896            .filter_map(SyntaxElement::into_token)
897            .find(|t| t.kind() == SyntaxKind::ANY_KW)
898    }
899
900    pub fn all_token(&self) -> Option<SyntaxToken> {
901        self.syntax
902            .children_with_tokens()
903            .filter_map(SyntaxElement::into_token)
904            .find(|t| t.kind() == SyntaxKind::ALL_KW)
905    }
906
907    pub fn none_token(&self) -> Option<SyntaxToken> {
908        self.syntax
909            .children_with_tokens()
910            .filter_map(SyntaxElement::into_token)
911            .find(|t| t.kind() == SyntaxKind::NONE_KW)
912    }
913
914    pub fn single_token(&self) -> Option<SyntaxToken> {
915        self.syntax
916            .children_with_tokens()
917            .filter_map(SyntaxElement::into_token)
918            .find(|t| t.kind() == SyntaxKind::SINGLE_KW)
919    }
920
921    pub fn in_token(&self) -> Option<SyntaxToken> {
922        self.syntax
923            .children_with_tokens()
924            .filter_map(SyntaxElement::into_token)
925            .find(|t| t.kind() == SyntaxKind::IN_KW)
926    }
927}
928
929#[derive(Debug, Clone, PartialEq, Eq, Hash)]
930pub struct PatternComprehension {
931    syntax: SyntaxNode,
932}
933
934impl PatternComprehension {
935    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
936        (syntax.kind() == SyntaxKind::PATTERN_COMPREHENSION).then_some(Self { syntax })
937    }
938
939    pub fn syntax(&self) -> &SyntaxNode {
940        &self.syntax
941    }
942
943    pub fn where_clause(&self) -> Option<WhereClause> {
944        self.syntax.children().find_map(WhereClause::cast)
945    }
946
947    pub fn projection(&self) -> Option<Expr> {
948        self.syntax.children().find_map(Expr::cast)
949    }
950}
951
952#[derive(Debug, Clone, PartialEq, Eq, Hash)]
953pub struct CaseExpr {
954    syntax: SyntaxNode,
955}
956
957impl CaseExpr {
958    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
959        (syntax.kind() == SyntaxKind::CASE_EXPR).then_some(Self { syntax })
960    }
961
962    pub fn syntax(&self) -> &SyntaxNode {
963        &self.syntax
964    }
965
966    pub fn scrutinee(&self) -> Option<Expr> {
967        self.syntax.children().find_map(Expr::cast)
968    }
969
970    pub fn arms(&self) -> Option<CaseWhenArm> {
971        self.syntax.children().find_map(CaseWhenArm::cast)
972    }
973
974    pub fn case_when_arm(&self) -> impl Iterator<Item = CaseWhenArm> + '_ {
975        self.syntax.children().filter_map(CaseWhenArm::cast)
976    }
977
978    pub fn else_arm(&self) -> Option<CaseElseArm> {
979        self.syntax.children().find_map(CaseElseArm::cast)
980    }
981
982    pub fn case_token(&self) -> Option<SyntaxToken> {
983        self.syntax
984            .children_with_tokens()
985            .filter_map(SyntaxElement::into_token)
986            .find(|t| t.kind() == SyntaxKind::CASE_KW)
987    }
988
989    pub fn end_token(&self) -> Option<SyntaxToken> {
990        self.syntax
991            .children_with_tokens()
992            .filter_map(SyntaxElement::into_token)
993            .find(|t| t.kind() == SyntaxKind::END_KW)
994    }
995}
996
997#[derive(Debug, Clone, PartialEq, Eq, Hash)]
998pub struct BinaryExpr {
999    syntax: SyntaxNode,
1000}
1001
1002impl BinaryExpr {
1003    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
1004        (syntax.kind() == SyntaxKind::BINARY_EXPR).then_some(Self { syntax })
1005    }
1006
1007    pub fn syntax(&self) -> &SyntaxNode {
1008        &self.syntax
1009    }
1010
1011    pub fn lhs(&self) -> Option<Expr> {
1012        self.syntax.children().find_map(Expr::cast)
1013    }
1014
1015    pub fn rhs(&self) -> Option<Expr> {
1016        self.syntax.children().find_map(Expr::cast)
1017    }
1018}
1019
1020#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1021pub struct UnaryExpr {
1022    syntax: SyntaxNode,
1023}
1024
1025impl UnaryExpr {
1026    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
1027        (syntax.kind() == SyntaxKind::UNARY_EXPR).then_some(Self { syntax })
1028    }
1029
1030    pub fn syntax(&self) -> &SyntaxNode {
1031        &self.syntax
1032    }
1033
1034    pub fn operand(&self) -> Option<Expr> {
1035        self.syntax.children().find_map(Expr::cast)
1036    }
1037}
1038
1039#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1040pub struct PatternPredicate {
1041    syntax: SyntaxNode,
1042}
1043
1044impl PatternPredicate {
1045    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
1046        (syntax.kind() == SyntaxKind::PATTERN_PREDICATE).then_some(Self { syntax })
1047    }
1048
1049    pub fn syntax(&self) -> &SyntaxNode {
1050        &self.syntax
1051    }
1052}
1053
1054#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1055pub struct CaseWhenArm {
1056    syntax: SyntaxNode,
1057}
1058
1059impl CaseWhenArm {
1060    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
1061        (syntax.kind() == SyntaxKind::CASE_WHEN_ARM).then_some(Self { syntax })
1062    }
1063
1064    pub fn syntax(&self) -> &SyntaxNode {
1065        &self.syntax
1066    }
1067
1068    pub fn when_value(&self) -> Option<Expr> {
1069        self.syntax.children().find_map(Expr::cast)
1070    }
1071
1072    pub fn then_value(&self) -> Option<Expr> {
1073        self.syntax.children().find_map(Expr::cast)
1074    }
1075
1076    pub fn when_token(&self) -> Option<SyntaxToken> {
1077        self.syntax
1078            .children_with_tokens()
1079            .filter_map(SyntaxElement::into_token)
1080            .find(|t| t.kind() == SyntaxKind::WHEN_KW)
1081    }
1082
1083    pub fn then_token(&self) -> Option<SyntaxToken> {
1084        self.syntax
1085            .children_with_tokens()
1086            .filter_map(SyntaxElement::into_token)
1087            .find(|t| t.kind() == SyntaxKind::THEN_KW)
1088    }
1089}
1090
1091#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1092pub struct CaseElseArm {
1093    syntax: SyntaxNode,
1094}
1095
1096impl CaseElseArm {
1097    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
1098        (syntax.kind() == SyntaxKind::CASE_ELSE_ARM).then_some(Self { syntax })
1099    }
1100
1101    pub fn syntax(&self) -> &SyntaxNode {
1102        &self.syntax
1103    }
1104
1105    pub fn value(&self) -> Option<Expr> {
1106        self.syntax.children().find_map(Expr::cast)
1107    }
1108
1109    pub fn else_token(&self) -> Option<SyntaxToken> {
1110        self.syntax
1111            .children_with_tokens()
1112            .filter_map(SyntaxElement::into_token)
1113            .find(|t| t.kind() == SyntaxKind::ELSE_KW)
1114    }
1115}
1116
1117#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1118pub enum Clause {
1119    MatchClause(MatchClause),
1120    WithClause(WithClause),
1121    ReturnClause(ReturnClause),
1122    UnwindClause(UnwindClause),
1123    CallClause(CallClause),
1124    CreateClause(CreateClause),
1125    MergeClause(MergeClause),
1126    SetClause(SetClause),
1127    RemoveClause(RemoveClause),
1128    DeleteClause(DeleteClause),
1129}
1130
1131impl Clause {
1132    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
1133        if let Some(inner) = MatchClause::cast(syntax.clone()) {
1134            return Some(Self::MatchClause(inner));
1135        }
1136        if let Some(inner) = WithClause::cast(syntax.clone()) {
1137            return Some(Self::WithClause(inner));
1138        }
1139        if let Some(inner) = ReturnClause::cast(syntax.clone()) {
1140            return Some(Self::ReturnClause(inner));
1141        }
1142        if let Some(inner) = UnwindClause::cast(syntax.clone()) {
1143            return Some(Self::UnwindClause(inner));
1144        }
1145        if let Some(inner) = CallClause::cast(syntax.clone()) {
1146            return Some(Self::CallClause(inner));
1147        }
1148        if let Some(inner) = CreateClause::cast(syntax.clone()) {
1149            return Some(Self::CreateClause(inner));
1150        }
1151        if let Some(inner) = MergeClause::cast(syntax.clone()) {
1152            return Some(Self::MergeClause(inner));
1153        }
1154        if let Some(inner) = SetClause::cast(syntax.clone()) {
1155            return Some(Self::SetClause(inner));
1156        }
1157        if let Some(inner) = RemoveClause::cast(syntax.clone()) {
1158            return Some(Self::RemoveClause(inner));
1159        }
1160        if let Some(inner) = DeleteClause::cast(syntax) {
1161            return Some(Self::DeleteClause(inner));
1162        }
1163        None
1164    }
1165
1166    pub fn syntax(&self) -> &SyntaxNode {
1167        match self {
1168            Self::MatchClause(inner) => inner.syntax(),
1169            Self::WithClause(inner) => inner.syntax(),
1170            Self::ReturnClause(inner) => inner.syntax(),
1171            Self::UnwindClause(inner) => inner.syntax(),
1172            Self::CallClause(inner) => inner.syntax(),
1173            Self::CreateClause(inner) => inner.syntax(),
1174            Self::MergeClause(inner) => inner.syntax(),
1175            Self::SetClause(inner) => inner.syntax(),
1176            Self::RemoveClause(inner) => inner.syntax(),
1177            Self::DeleteClause(inner) => inner.syntax(),
1178        }
1179    }
1180}
1181
1182#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1183pub enum Expr {
1184    IndexExpr(IndexExpr),
1185    SliceExpr(SliceExpr),
1186    FunctionCall(FunctionCall),
1187    ParenExpr(ParenExpr),
1188    ListLiteral(ListLiteral),
1189    MapLiteral(MapLiteral),
1190    MapProjection(MapProjection),
1191    ListComprehension(ListComprehension),
1192    ListPredicateExpr(ListPredicateExpr),
1193    PatternComprehension(PatternComprehension),
1194    CaseExpr(CaseExpr),
1195    BinaryExpr(BinaryExpr),
1196    UnaryExpr(UnaryExpr),
1197    PatternPredicate(PatternPredicate),
1198}
1199
1200impl Expr {
1201    pub fn cast(syntax: SyntaxNode) -> Option<Self> {
1202        if let Some(inner) = IndexExpr::cast(syntax.clone()) {
1203            return Some(Self::IndexExpr(inner));
1204        }
1205        if let Some(inner) = SliceExpr::cast(syntax.clone()) {
1206            return Some(Self::SliceExpr(inner));
1207        }
1208        if let Some(inner) = FunctionCall::cast(syntax.clone()) {
1209            return Some(Self::FunctionCall(inner));
1210        }
1211        if let Some(inner) = ParenExpr::cast(syntax.clone()) {
1212            return Some(Self::ParenExpr(inner));
1213        }
1214        if let Some(inner) = ListLiteral::cast(syntax.clone()) {
1215            return Some(Self::ListLiteral(inner));
1216        }
1217        if let Some(inner) = MapLiteral::cast(syntax.clone()) {
1218            return Some(Self::MapLiteral(inner));
1219        }
1220        if let Some(inner) = MapProjection::cast(syntax.clone()) {
1221            return Some(Self::MapProjection(inner));
1222        }
1223        if let Some(inner) = ListComprehension::cast(syntax.clone()) {
1224            return Some(Self::ListComprehension(inner));
1225        }
1226        if let Some(inner) = ListPredicateExpr::cast(syntax.clone()) {
1227            return Some(Self::ListPredicateExpr(inner));
1228        }
1229        if let Some(inner) = PatternComprehension::cast(syntax.clone()) {
1230            return Some(Self::PatternComprehension(inner));
1231        }
1232        if let Some(inner) = CaseExpr::cast(syntax.clone()) {
1233            return Some(Self::CaseExpr(inner));
1234        }
1235        if let Some(inner) = BinaryExpr::cast(syntax.clone()) {
1236            return Some(Self::BinaryExpr(inner));
1237        }
1238        if let Some(inner) = UnaryExpr::cast(syntax.clone()) {
1239            return Some(Self::UnaryExpr(inner));
1240        }
1241        if let Some(inner) = PatternPredicate::cast(syntax) {
1242            return Some(Self::PatternPredicate(inner));
1243        }
1244        None
1245    }
1246
1247    pub fn syntax(&self) -> &SyntaxNode {
1248        match self {
1249            Self::IndexExpr(inner) => inner.syntax(),
1250            Self::SliceExpr(inner) => inner.syntax(),
1251            Self::FunctionCall(inner) => inner.syntax(),
1252            Self::ParenExpr(inner) => inner.syntax(),
1253            Self::ListLiteral(inner) => inner.syntax(),
1254            Self::MapLiteral(inner) => inner.syntax(),
1255            Self::MapProjection(inner) => inner.syntax(),
1256            Self::ListComprehension(inner) => inner.syntax(),
1257            Self::ListPredicateExpr(inner) => inner.syntax(),
1258            Self::PatternComprehension(inner) => inner.syntax(),
1259            Self::CaseExpr(inner) => inner.syntax(),
1260            Self::BinaryExpr(inner) => inner.syntax(),
1261            Self::UnaryExpr(inner) => inner.syntax(),
1262            Self::PatternPredicate(inner) => inner.syntax(),
1263        }
1264    }
1265}