1use std::ops::Bound;
2
3use crate::expr::access_type::{BearerAccess, JwtAccessVerify};
4use crate::expr::data::Assignment;
5use crate::expr::field::Selector;
6use crate::expr::graphql_config::GraphQLConfig;
7use crate::expr::lookup::LookupSubject;
8use crate::expr::order::Ordering;
9use crate::expr::part::{DestructurePart, Recurse, RecurseInstruction};
10use crate::expr::permission::{Permission, Permissions};
11use crate::expr::reference::{Reference, ReferenceDeleteStrategy};
12use crate::expr::statements::access::{
13 AccessStatementGrant, AccessStatementPurge, AccessStatementRevoke, AccessStatementShow, Subject,
14};
15use crate::expr::statements::alter::{
16 AlterAccessStatement, AlterAnalyzerStatement, AlterApiClause, AlterApiStatement,
17 AlterBucketStatement, AlterConfigStatement, AlterDatabaseStatement, AlterDefault,
18 AlterEventStatement, AlterFieldStatement, AlterFunctionStatement, AlterIndexStatement,
19 AlterKind, AlterModuleStatement, AlterNamespaceStatement, AlterParamStatement,
20 AlterSequenceStatement, AlterSystemStatement, AlterTableStatement, AlterUserStatement,
21};
22use crate::expr::statements::define::config::ConfigInner;
23use crate::expr::statements::define::config::api::ApiConfig;
24use crate::expr::statements::define::config::defaults::DefaultConfig;
25use crate::expr::statements::define::{
26 ApiAction, DefineBucketStatement, DefineConfigStatement, DefineDefault, DefineSequenceStatement,
27};
28use crate::expr::statements::rebuild::RebuildStatement;
29use crate::expr::statements::remove::{
30 RemoveApiStatement, RemoveBucketStatement, RemoveSequenceStatement,
31};
32use crate::expr::statements::{
33 AccessStatement, AlterStatement, CreateStatement, DefineAccessStatement,
34 DefineAnalyzerStatement, DefineApiStatement, DefineDatabaseStatement, DefineEventStatement,
35 DefineFieldStatement, DefineFunctionStatement, DefineIndexStatement, DefineModelStatement,
36 DefineModuleStatement, DefineNamespaceStatement, DefineParamStatement, DefineStatement,
37 DefineTableStatement, DefineUserStatement, DeleteStatement, ForeachStatement, IfelseStatement,
38 InfoStatement, InsertStatement, KillStatement, LiveFields, LiveStatement, OptionStatement,
39 OutputStatement, RelateStatement, RemoveAccessStatement, RemoveAnalyzerStatement,
40 RemoveConfigStatement, RemoveDatabaseStatement, RemoveEventStatement, RemoveFieldStatement,
41 RemoveFunctionStatement, RemoveIndexStatement, RemoveModelStatement, RemoveModuleStatement,
42 RemoveNamespaceStatement, RemoveParamStatement, RemoveStatement, RemoveTableStatement,
43 RemoveUserStatement, SelectStatement, SetStatement, ShowStatement, SleepStatement,
44 UpdateStatement, UpsertStatement, UseStatement,
45};
46use crate::expr::table_type::{Relation, TableType};
47use crate::expr::{
48 AccessType, Block, ClosureExpr, Data, Expr, Field, Fields, Function, FunctionCall, Idiom,
49 JwtAccess, Kind, KindLiteral, Literal, Lookup, Model, Output, Param, Part, RecordAccess,
50 RecordIdKeyLit, RecordIdKeyRangeLit, RecordIdLit, TopLevelExpr, View,
51};
52
53macro_rules! implement_visitor{
54 ($(fn $name:ident($this:ident, $value:ident: &$ty:ty) {
55 $($t:tt)*
56 })*) => {
57
58 #[allow(dead_code)]
60 pub trait Visit<V: Visitor>{
61 fn visit(&self, v: &mut V) -> Result<(), V::Error>;
62 }
63
64 #[allow(dead_code)]
70 pub trait Visitor: Sized {
71 type Error;
72
73 $(
74 fn $name(&mut self, $value: &$ty) -> Result<(), Self::Error>{
75 $value.visit(self)
76 }
77 )*
78 }
79
80 $(
81 impl<V: Visitor> Visit<V> for $ty {
82 #[allow(unused_variables)]
83 fn visit(&self, $this: &mut V) -> Result<(), V::Error>{
84 let $value = self;
85 $($t)*
86 }
87 }
88 )*
89 };
90}
91
92macro_rules! implement_visitor_mut{
93 ($(fn $name:ident($this:ident, $value:ident: &mut $ty:ty) {
94 $($t:tt)*
95 })*) => {
96
97 #[allow(dead_code)]
99 pub trait VisitMut<V: MutVisitor>{
100 fn visit_mut(&mut self, v: &mut V) -> Result<(), V::Error>;
101 }
102
103 #[allow(dead_code)]
109 pub trait MutVisitor: Sized {
110 type Error;
111
112 $(
113 fn $name(&mut self, $value: &mut $ty) -> Result<(), Self::Error>{
114 $value.visit_mut(self)
115 }
116 )*
117 }
118
119 $(
120 impl<V: MutVisitor> VisitMut<V> for $ty {
121 #[allow(unused_variables)]
122 fn visit_mut(&mut self, $this: &mut V) -> Result<(), V::Error>{
123 let $value = self;
124 $($t)*
125 }
126 }
127 )*
128 };
129}
130
131implement_visitor! {
134 fn visit_top_level_expr(this, value: &TopLevelExpr) {
135 match value {
136 TopLevelExpr::Begin => {},
137 TopLevelExpr::Cancel => {},
138 TopLevelExpr::Commit => {},
139 TopLevelExpr::Access(s) => {this.visit_access(s)? },
140 TopLevelExpr::Kill(s) => {this.visit_kill(s)?; },
141 TopLevelExpr::Live(s) => {this.visit_live(s)?; },
142 TopLevelExpr::Option(s) =>{ this.visit_option(s)?; },
143 TopLevelExpr::Use(s) => {this.visit_use(s)?; },
144 TopLevelExpr::Show(s) => {this.visit_show(s)?; },
145 TopLevelExpr::Expr(e) => {this.visit_expr(e)?; },
146 }
147 Ok(())
148 }
149
150 fn visit_access(this, a: &AccessStatement){
151 match a {
152 AccessStatement::Grant(a) => {
153 this.visit_access_grant(a)?;
154 },
155 AccessStatement::Show(a) => {
156 this.visit_access_show(a)?;
157 },
158 AccessStatement::Revoke(a) => {
159 this.visit_access_revoke(a)?;
160 },
161 AccessStatement::Purge(a) => {
162 this.visit_access_purge(a)?;
163 },
164 }
165 Ok(())
166 }
167
168 fn visit_access_grant(this, a: &AccessStatementGrant){
169 this.visit_access_subject(&a.subject)?;
170 Ok(())
171 }
172
173 fn visit_access_subject(this, s: &Subject){
174 match s{
175 Subject::Record(r) => {
176 this.visit_record_id(r)?;
177 },
178 Subject::User(_) => { }
179 }
180 Ok(())
181 }
182
183 fn visit_access_show(this, a: &AccessStatementShow){
184 if let Some(c) = a.cond.as_ref(){
185 this.visit_expr(&c.0)?;
186 }
187 Ok(())
188 }
189 fn visit_access_revoke(this, a: &AccessStatementRevoke){
190 if let Some(c) = a.cond.as_ref(){
191 this.visit_expr(&c.0)?;
192 }
193 Ok(())
194 }
195 fn visit_access_purge(this, a: &AccessStatementPurge){
196 Ok(())
197 }
198
199
200 fn visit_kill(this, i: &KillStatement){
201 this.visit_expr(&i.id)?;
202 Ok(())
203 }
204
205 fn visit_live(this, l: &LiveStatement){
206 match &l.fields{
207 LiveFields::Diff => {},
208 LiveFields::Select(x) => {
209 this.visit_fields(x)?;
210 }
211 }
212 this.visit_expr(&l.what)?;
213 if let Some(c) = l.cond.as_ref(){
214 this.visit_expr(&c.0)?;
215 }
216 if let Some(f) = l.fetch.as_ref(){
217 for f in f.iter(){
218 this.visit_expr(&f.0)?;
219 }
220 }
221
222 Ok(())
223 }
224
225 fn visit_option(this, i: &OptionStatement){
226 Ok(())
227 }
228
229 fn visit_show(this, s: &ShowStatement){
230 Ok(())
231 }
232
233 fn visit_expr(this, s: &Expr){
234 match s {
235 Expr::Literal(literal) => {
236 this.visit_literal(literal)?;
237 }
238 Expr::Param(p) => {
239 this.visit_param(p)?;
240 }
241 Expr::Table(_) |
242 Expr::Mock(_) |
243 Expr::Constant(_) |
244 Expr::Break |
245 Expr::Continue => {},
246 Expr::Idiom(idiom) => {
247 this.visit_idiom(idiom)?;
248 }
249 Expr::Block(block) => {
250 this.visit_block(block)?;
251 }
252 Expr::Prefix { expr, .. } => {
253 this.visit_expr(expr)?;
254 },
255 Expr::Postfix { expr, op } => {
256 this.visit_expr(expr)?;
257 match op {
261 crate::expr::operator::PostfixOperator::Range
262 | crate::expr::operator::PostfixOperator::RangeSkip => {},
263 crate::expr::operator::PostfixOperator::MethodCall(_, args)
264 | crate::expr::operator::PostfixOperator::Call(args) => {
265 for a in args.iter(){
266 this.visit_expr(a)?;
267 }
268 }
269 }
270 },
271 Expr::Binary { left, right, .. } => {
272 this.visit_expr(left)?;
273 this.visit_expr(right)?;
274 },
275 Expr::FunctionCall(f) => {
276 this.visit_function_call(f)?;
277 },
278 Expr::Closure(c) => {
279 this.visit_closure(c)?;
280 },
281 Expr::Return(o) => {
282 this.visit_output_stmt(o)?;
283 },
284 Expr::Throw(e) => {
285 this.visit_expr(e)?;
286 },
287 Expr::IfElse(s) => {
288 this.visit_if_else(s)?;
289 },
290 Expr::Select(s) => { this.visit_select(s)?; },
291 Expr::Create(s) => { this.visit_create(s)?; },
292 Expr::Update(s) => { this.visit_update(s)?; },
293 Expr::Upsert(s) => { this.visit_upsert(s)?; },
294 Expr::Delete(s) => { this.visit_delete(s)?; },
295 Expr::Relate(s) => { this.visit_relate(s)?; },
296 Expr::Insert(s) => { this.visit_insert(s)?; },
297 Expr::Define(s) => { this.visit_define(s)?; },
298 Expr::Remove(s) => { this.visit_remove(s)?; },
299 Expr::Rebuild(s) => {
300 this.visit_rebuild(s)?;
301 },
302 Expr::Alter(s) => {
303 this.visit_alter(s)?;
304 },
305 Expr::Info(s) => {
306 this.visit_info(s)?;
307 },
308 Expr::Foreach(s) => {
309 this.visit_foreach(s)?;
310 },
311 Expr::Let(s) => {
312 this.visit_set(s)?;
313 },
314 Expr::Sleep(s) => {
315 this.visit_sleep(s)?;
316 },
317 Expr::Explain { statement, .. } => {
318 this.visit_expr(statement)?;
319 },
320 Expr::Match(plan) => {
321 use crate::expr::match_plan::{MatchStage, MutationStage, UpdateData};
322 for stage in plan.stages.iter(){
325 match stage {
326 MatchStage::Read(clause) => {
327 for predicate in clause.predicates.iter(){
328 this.visit_expr(&predicate.expr)?;
329 }
330 }
331 MatchStage::Mutate(MutationStage::Update { data, .. }) => match data {
332 UpdateData::Set(assignments) => {
333 for (_, value) in assignments.iter(){
334 this.visit_expr(value)?;
335 }
336 }
337 UpdateData::Unset(_) => {}
338 UpdateData::Content(expr) => this.visit_expr(expr)?,
339 },
340 MatchStage::Mutate(MutationStage::Delete { .. }) => {}
341 MatchStage::Mutate(MutationStage::Insert(insert)) => {
342 for node in insert.nodes.iter(){
343 this.visit_expr(&node.props)?;
344 }
345 for edge in insert.edges.iter(){
346 this.visit_expr(&edge.props)?;
347 }
348 }
349 }
350 }
351 if let Some(output) = plan.output.as_ref(){
352 for column in output.columns.iter(){
353 this.visit_expr(&column.expr)?;
354 }
355 for order in output.order.iter(){
356 this.visit_expr(&order.expr)?;
357 }
358 if let Some(skip) = output.skip.as_ref(){
359 this.visit_expr(skip)?;
360 }
361 if let Some(limit) = output.limit.as_ref(){
362 this.visit_expr(limit)?;
363 }
364 }
365 },
366 }
367
368 Ok(())
369 }
370
371 fn visit_literal(this, s: &Literal){
372 match s {
373 Literal::None |
374 Literal::Null |
375 Literal::UnboundedRange |
376 Literal::Bool(_) |
377 Literal::Float(_) |
378 Literal::Integer(_) |
379 Literal::Decimal(_) |
380 Literal::String(_) |
381 Literal::Bytes(_) |
382 Literal::Regex(_) |
383 Literal::Datetime(_) |
384 Literal::Duration(_) |
385 Literal::Uuid(_) |
386 Literal::File(_) |
387 Literal::Geometry(_) => {},
388 Literal::RecordId(r) => {
389 this.visit_record_id(r)?;
390 },
391 Literal::Array(exprs) => {
392 for expr in exprs.iter() {
393 this.visit_expr(expr)?;
394 }
395 },
396 Literal::Set(exprs) => {
397 for expr in exprs.iter() {
398 this.visit_expr(expr)?;
399 }
400 },
401 Literal::Object(items) => {
402 for entry in items{
403 this.visit_expr(&entry.value)?
404 }
405 },
406 }
407
408 Ok(())
409 }
410
411 fn visit_alter(this, a: &AlterStatement){
412 match a {
413 AlterStatement::System(a)=>{ this.visit_alter_system(a)?; },
414 AlterStatement::Namespace(a)=>{ this.visit_alter_namespace(a)?; },
415 AlterStatement::Database(a)=>{ this.visit_alter_database(a)?; },
416 AlterStatement::Table(a)=>{ this.visit_alter_table(a)?; },
417 AlterStatement::Event(a)=>{ this.visit_alter_event(a)?; },
418 AlterStatement::Index(a) => { this.visit_alter_index(a)?; },
419 AlterStatement::Sequence(a) => { this.visit_alter_sequence(a)?; },
420 AlterStatement::Field(a) => { this.visit_alter_field(a)?; },
421 AlterStatement::Param(a) => { this.visit_alter_param(a)?; },
422 AlterStatement::Bucket(a) => { this.visit_alter_bucket(a)?; },
423 AlterStatement::Config(a) => { this.visit_alter_config(a)?; },
424 AlterStatement::Analyzer(a) => { this.visit_alter_analyzer(a)?; },
425 AlterStatement::Function(a) => { this.visit_alter_function(a)?; },
426 AlterStatement::Access(a) => { this.visit_alter_access(a)?; },
427 AlterStatement::User(a) => { this.visit_alter_user(a)?; },
428 AlterStatement::Api(a) => { this.visit_alter_api(a)?; },
429 AlterStatement::Module(a) => { this.visit_alter_module(a)?; },
430 }
431 Ok(())
432 }
433
434 fn visit_alter_module(this, a: &AlterModuleStatement){
435 if let Some(ref p) = a.permissions {
436 this.visit_permission(p)?;
437 }
438 Ok(())
439 }
440
441 fn visit_alter_user(this, a: &AlterUserStatement){
442 this.visit_expr(&a.name)?;
443 Ok(())
444 }
445
446 fn visit_alter_api(this, a: &AlterApiStatement){
447 for clause in &a.clauses {
448 match clause {
449 AlterApiClause::ForAny { fallback, .. } => {
450 if let AlterKind::Set(x) = fallback {
451 this.visit_expr(x)?;
452 }
453 }
454 AlterApiClause::SetAction(action) => {
455 this.visit_expr(&action.action)?;
456 }
457 AlterApiClause::DropAction { .. } => {}
458 }
459 }
460 Ok(())
461 }
462
463 fn visit_alter_access(this, a: &AlterAccessStatement){
464 this.visit_expr(&a.name)?;
465 match a.authenticate {
466 AlterKind::None |
467 AlterKind::Drop => {},
468 AlterKind::Set(ref x) => this.visit_expr(x)?,
469 }
470 match a.context {
471 AlterKind::None |
472 AlterKind::Drop => {},
473 AlterKind::Set(ref x) => this.visit_expr(x)?,
474 }
475 Ok(())
476 }
477
478 fn visit_alter_system(this, a: &AlterSystemStatement){
479 Ok(())
480 }
481
482 fn visit_alter_namespace(this, a: &AlterNamespaceStatement){
483 Ok(())
484 }
485
486 fn visit_alter_database(this, a: &AlterDatabaseStatement){
487 Ok(())
488 }
489
490 fn visit_alter_table(this, a: &AlterTableStatement){
491 this.visit_expr(&a.name)?;
492 if let Some(p) = a.permissions.as_ref(){
493 this.visit_permissions(p)?;
494 }
495 Ok(())
496 }
497
498 fn visit_alter_event(this, a: &AlterEventStatement){
499 this.visit_expr(&a.name)?;
500 this.visit_expr(&a.what)?;
501 match a.when {
502 AlterKind::None |
503 AlterKind::Drop => {},
504 AlterKind::Set(ref x) => this.visit_expr(x)?,
505 }
506 match a.then {
507 AlterKind::None |
508 AlterKind::Drop => {},
509 AlterKind::Set(ref v) => {
510 for x in v.iter() {
511 this.visit_expr(x)?;
512 }
513 },
514 }
515 Ok(())
516 }
517
518 fn visit_alter_index(this, a: &AlterIndexStatement){
519 this.visit_expr(&a.name)?;
520 this.visit_expr(&a.table)?;
521 Ok(())
522 }
523
524 fn visit_alter_sequence(this, a: &AlterSequenceStatement){
525 this.visit_expr(&a.name)?;
526 if let Some(ref t) = a.timeout {
527 this.visit_expr(t)?;
528 }
529 Ok(())
530 }
531
532 fn visit_alter_param(this, a: &AlterParamStatement){
533 if let Some(ref x) = a.value {
534 this.visit_expr(x)?;
535 }
536 if let Some(ref p) = a.permissions {
537 this.visit_permission(p)?;
538 }
539 Ok(())
540 }
541
542 fn visit_alter_bucket(this, a: &AlterBucketStatement){
543 this.visit_expr(&a.name)?;
544 if let Some(ref p) = a.permissions {
545 this.visit_permission(p)?;
546 }
547 Ok(())
548 }
549
550 fn visit_alter_config(this, a: &AlterConfigStatement){
551 this.visit_config_inner(&a.inner)?;
552 Ok(())
553 }
554
555 fn visit_alter_analyzer(this, a: &AlterAnalyzerStatement){
556 this.visit_expr(&a.name)?;
557 Ok(())
558 }
559
560 fn visit_alter_function(this, a: &AlterFunctionStatement){
561 if let Some(ref p) = a.permissions {
562 this.visit_permission(p)?;
563 }
564 Ok(())
565 }
566
567 fn visit_alter_field(this, a: &AlterFieldStatement){
568 this.visit_expr(&a.name)?;
569 this.visit_expr(&a.what)?;
570
571 match a.value {
572 AlterKind::None |
573 AlterKind::Drop => {},
574 AlterKind::Set(ref x) => this.visit_expr(x)?,
575 }
576
577 match a.assert{
578 AlterKind::None |
579 AlterKind::Drop => {},
580 AlterKind::Set(ref x) => this.visit_expr(x)?,
581 }
582
583 match a.default{
584 AlterDefault::None |
585 AlterDefault::Drop => {},
586 AlterDefault::Set(ref x) => this.visit_expr(x)?,
587 AlterDefault::Always(ref x) => this.visit_expr(x)?,
588 }
589
590 if let Some(p) = a.permissions.as_ref(){
591 this.visit_permissions(p)?;
592 }
593
594 match a.reference{
595 AlterKind::None |
596 AlterKind::Drop => {},
597 AlterKind::Set(ref x) => this.visit_reference(x)?,
598 }
599
600 Ok(())
601 }
602
603 fn visit_upsert(this, u: &UpsertStatement){
604 for v in u.what.iter(){
605 this.visit_expr(v)?;
606 }
607 if let Some(d) = u.data.as_ref(){
608 this.visit_data(d)?;
609 }
610 if let Some(o) = u.output.as_ref(){
611 this.visit_output(o)?;
612 }
613 if let Some(c) = u.cond.as_ref(){
614 this.visit_expr(&c.0)?;
615 }
616 Ok(())
617
618 }
619
620 fn visit_rebuild(this, r: &RebuildStatement){
621 Ok(())
622 }
623
624 fn visit_use(this, t: &UseStatement){
625 Ok(())
626 }
627
628 fn visit_update(this, u: &UpdateStatement){
629 for v in u.what.iter(){
630 this.visit_expr(v)?;
631 }
632 if let Some(d) = u.data.as_ref(){
633 this.visit_data(d)?;
634 }
635 if let Some(o) = u.output.as_ref(){
636 this.visit_output(o)?;
637 }
638 if let Some(c) = u.cond.as_ref(){
639 this.visit_expr(&c.0)?;
640 }
641 Ok(())
642
643 }
644
645 fn visit_sleep(this, s: &SleepStatement){
646 Ok(())
647 }
648
649 fn visit_set(this, s: &SetStatement){
650 if let Some(k) = s.kind.as_ref(){
651 this.visit_kind(k)?;
652 }
653 this.visit_expr(&s.what)?;
654 Ok(())
655 }
656
657 fn visit_select(this, s: &SelectStatement){
658 this.visit_fields(&s.fields)?;
659 for o in s.omit.iter(){
660 this.visit_expr(o)?;
661 }
662 for v in s.what.iter(){
663 this.visit_expr(v)?;
664 }
665 if let Some(c) = s.cond.as_ref(){
666 this.visit_expr(&c.0)?;
667 }
668 if let Some(s) = s.split.as_ref(){
669 for s in s.0.iter(){
670 this.visit_idiom(&s.0)?;
671 }
672 }
673 if let Some(g) = s.group.as_ref(){
674 for g in g.0.iter(){
675 this.visit_idiom(&g.0)?;
676 }
677 }
678 if let Some(o) = s.order.as_ref(){
679 this.visit_ordering(o)?;
680 }
681 if let Some(l) = s.limit.as_ref(){
682 this.visit_expr(&l.0)?;
683 }
684 if let Some(f) = s.fetch.as_ref(){
685 for f in f.iter(){
686 this.visit_expr(&f.0)?;
687 }
688 }
689 this.visit_expr(&s.version)?;
690
691 Ok(())
692 }
693
694 fn visit_remove(this, r: &RemoveStatement){
695 match r {
696 RemoveStatement::Namespace(r) => {
697 this.visit_remove_namespace(r)?;
698 },
699 RemoveStatement::Database(r) => {
700 this.visit_remove_database(r)?;
701 },
702 RemoveStatement::Function(r) => {
703 this.visit_remove_function(r)?;
704 },
705 RemoveStatement::Analyzer(r) => {
706 this.visit_remove_analyzer(r)?;
707 },
708 RemoveStatement::Access(r) => {
709 this.visit_remove_access(r)?;
710 },
711 RemoveStatement::Param(r) => {
712 this.visit_remove_param(r)?;
713 },
714 RemoveStatement::Table(r) => {
715 this.visit_remove_table(r)?;
716 },
717 RemoveStatement::Event(r) => {
718 this.visit_remove_event(r)?;
719 },
720 RemoveStatement::Field(r) => {
721 this.visit_remove_field(r)?;
722 },
723 RemoveStatement::Index(r) => {
724 this.visit_remove_index(r)?;
725 },
726 RemoveStatement::User(r) => {
727 this.visit_remove_user(r)?;
728 },
729 RemoveStatement::Model(r) => {
730 this.visit_remove_model(r)?;
731 },
732 RemoveStatement::Api(r) => {
733 this.visit_remove_api(r)?;
734 },
735 RemoveStatement::Bucket(r) => {
736 this.visit_remove_bucket(r)?;
737 },
738 RemoveStatement::Sequence(r) => {
739 this.visit_remove_sequence(r)?;
740 },
741 RemoveStatement::Module(r) => {
742 this.visit_remove_module(r)?;
743 },
744 RemoveStatement::Config(r) => {
745 this.visit_remove_config(r)?;
746 },
747 }
748 Ok(())
749 }
750
751 fn visit_remove_namespace(this, r: &RemoveNamespaceStatement){
752 this.visit_expr(&r.name)?;
753 Ok(())
754 }
755
756 fn visit_remove_database(this, r: &RemoveDatabaseStatement){
757 this.visit_expr(&r.name)?;
758 Ok(())
759 }
760
761 fn visit_remove_function(this, r: &RemoveFunctionStatement){
762 Ok(())
763 }
764
765 fn visit_remove_module(this, r: &RemoveModuleStatement){
766 Ok(())
767 }
768
769 fn visit_remove_config(this, r: &RemoveConfigStatement){
770 Ok(())
771 }
772
773 fn visit_remove_analyzer(this, r: &RemoveAnalyzerStatement){
774 this.visit_expr(&r.name)?;
775 Ok(())
776 }
777
778 fn visit_remove_access(this, r: &RemoveAccessStatement){
779 this.visit_expr(&r.name)?;
780 Ok(())
781 }
782
783 fn visit_remove_param(this, r: &RemoveParamStatement){
784 Ok(())
785 }
786
787 fn visit_remove_table(this, r: &RemoveTableStatement){
788 this.visit_expr(&r.name)?;
789 Ok(())
790 }
791
792 fn visit_remove_event(this, r: &RemoveEventStatement){
793 this.visit_expr(&r.name)?;
794 Ok(())
795 }
796
797 fn visit_remove_field(this, r: &RemoveFieldStatement){
798 this.visit_expr(&r.name)?;
799 Ok(())
800 }
801
802 fn visit_remove_index(this, r: &RemoveIndexStatement){
803 this.visit_expr(&r.name)?;
804 this.visit_expr(&r.what)?;
805 Ok(())
806 }
807
808 fn visit_remove_user(this, r: &RemoveUserStatement){
809 this.visit_expr(&r.name)?;
810 Ok(())
811 }
812
813 fn visit_remove_model(this, r: &RemoveModelStatement){
814 Ok(())
815 }
816
817
818 fn visit_remove_api(this, r: &RemoveApiStatement){
819 this.visit_expr(&r.name)?;
820 Ok(())
821 }
822
823 fn visit_remove_bucket(this, r: &RemoveBucketStatement){
824 this.visit_expr(&r.name)?;
825 Ok(())
826 }
827
828 fn visit_remove_sequence(this, r: &RemoveSequenceStatement){
829 this.visit_expr(&r.name)?;
830 Ok(())
831 }
832
833 fn visit_relate(this, o: &RelateStatement){
834 this.visit_expr(&o.through)?;
835 this.visit_expr(&o.from)?;
836 this.visit_expr(&o.to)?;
837 if let Some(d) = o.data.as_ref(){
838 this.visit_data(d)?;
839 }
840 if let Some(o) = o.output.as_ref(){
841 this.visit_output(o)?;
842 }
843 this.visit_expr(&o.timeout)?;
844 Ok(())
845 }
846
847 fn visit_output_stmt(this, o: &OutputStatement){
848 this.visit_expr(&o.what)?;
849 if let Some(f) = o.fetch.as_ref(){
850 for f in f.iter(){
851 this.visit_expr(&f.0)?;
852 }
853 }
854 Ok(())
855 }
856
857 fn visit_insert(this, i: &InsertStatement){
858 if let Some(into) = &i.into {
859 this.visit_expr(into)?;
860 }
861 this.visit_data(&i.data)?;
862 if let Some(update) = i.update.as_ref(){
863 this.visit_data(update)?;
864 }
865 if let Some(o) = i.output.as_ref(){
866 this.visit_output(o)?;
867 }
868 this.visit_expr(&i.timeout)?;
869 Ok(())
870 }
871
872 fn visit_info(this, i: &InfoStatement){
873 match i{
874 InfoStatement::Root(_, expr) |
875 InfoStatement::Ns(_, expr) |
876 InfoStatement::Db(_, expr) => {
877 if let Some(e) = expr.as_ref(){
878 this.visit_expr(e)?;
879 }
880 },
881 InfoStatement::Tb(expr, _, expr1) => {
882 this.visit_expr(expr)?;
883 if let Some(e) = expr1.as_ref(){
884 this.visit_expr(e)?;
885 }
886 },
887 InfoStatement::User(expr, base, _) => {
888 this.visit_expr(expr)?;
889 },
890 InfoStatement::Index(expr, expr1, _) => {
891 this.visit_expr(expr)?;
892 this.visit_expr(expr1)?;
893 },
894 }
895 Ok(())
896 }
897
898 fn visit_if_else(this, i: &IfelseStatement){
899 for e in i.exprs.iter(){
900 this.visit_expr(&e.0)?;
901 this.visit_expr(&e.1)?;
902 }
903 if let Some(x) = i.close.as_ref(){
904 this.visit_expr(x)?;
905 }
906 Ok(())
907 }
908
909 fn visit_foreach(this, f: &ForeachStatement){
910 this.visit_param(&f.param)?;
911 this.visit_expr(&f.range)?;
912 this.visit_block(&f.block)?;
913 Ok(())
914 }
915
916 fn visit_delete(this, d: &DeleteStatement){
917 for v in d.what.iter(){
918 this.visit_expr(v)?;
919 }
920 if let Some(c) = d.cond.as_ref(){
921 this.visit_expr(&c.0)?;
922 }
923 if let Some(o) = d.output.as_ref(){
924 this.visit_output(o)?;
925 }
926 this.visit_expr(&d.timeout)?;
927 Ok(())
928 }
929
930 fn visit_define(this, d: &DefineStatement){
931 match d {
932 DefineStatement::Namespace(d) => {
933 this.visit_define_namespace(d)?;
934 },
935 DefineStatement::Database(d) => {
936 this.visit_define_database(d)?;
937 },
938 DefineStatement::Function(d) => {
939 this.visit_define_function(d)?;
940 },
941 DefineStatement::Analyzer(d) => {
942 this.visit_define_analyzer(d)?;
943 },
944 DefineStatement::Param(d) => {
945 this.visit_define_param(d)?;
946 },
947 DefineStatement::Table(d) => {
948 this.visit_define_table(d)?;
949 },
950 DefineStatement::Event(d) => {
951 this.visit_define_event(d)?;
952 },
953 DefineStatement::Field(d) => {
954 this.visit_define_field(d)?;
955 },
956 DefineStatement::Index(d) => {
957 this.visit_define_index(d)?;
958 },
959 DefineStatement::User(d) => {
960 this.visit_define_user(d)?;
961 },
962 DefineStatement::Model(d) => {
963 this.visit_define_model(d)?;
964 },
965 DefineStatement::Access(d) => {
966 this.visit_define_access(d)?;
967 },
968 DefineStatement::Config(d) => {
969 this.visit_define_config(d)?;
970 },
971 DefineStatement::Api(d) => {
972 this.visit_define_api(d)?;
973 },
974 DefineStatement::Bucket(d) => {
975 this.visit_define_bucket(d)?;
976 },
977 DefineStatement::Sequence(d) => {
978 this.visit_define_sequence(d)?;
979 },
980 DefineStatement::Module(d) => {
981 this.visit_define_module(d)?;
982 },
983 }
984 Ok(())
985 }
986
987 fn visit_define_sequence(this, d: &DefineSequenceStatement) {
988 this.visit_expr(&d.name)?;
989 this.visit_expr(&d.batch)?;
990 this.visit_expr(&d.start)?;
991 this.visit_expr(&d.timeout)?;
992 Ok(())
993 }
994
995 fn visit_define_bucket(this, d: &DefineBucketStatement) {
996 this.visit_expr(&d.name)?;
997 if let Some(expr) = d.backend.as_ref(){
998 this.visit_expr(expr)?;
999 }
1000 this.visit_permission(&d.permissions)?;
1001 this.visit_expr(&d.comment)?;
1002 Ok(())
1003 }
1004
1005 fn visit_define_api(this, d: &DefineApiStatement) {
1006 this.visit_expr(&d.path)?;
1007 for act in d.actions.iter(){
1008 this.visit_api_action(act)?;
1009 }
1010 if let Some(f) = d.fallback.as_ref(){
1011 this.visit_expr(f)?;
1012 }
1013 this.visit_api_config(&d.config)?;
1014 this.visit_expr(&d.comment)?;
1015
1016 Ok(())
1017 }
1018
1019 fn visit_api_action(this, a: &ApiAction){
1020 this.visit_expr(&a.action)?;
1021 this.visit_api_config(&a.config)?;
1022 Ok(())
1023 }
1024
1025
1026 fn visit_define_config(this, d: &DefineConfigStatement) {
1027 this.visit_config_inner(&d.inner)
1028 }
1029
1030 fn visit_config_inner(this, d: &ConfigInner){
1031 match d {
1032 ConfigInner::GraphQL(graph_qlconfig) => {
1033 this.visit_graphql_config(graph_qlconfig)?;
1034 },
1035 ConfigInner::Api(api_config) => {
1036 this.visit_api_config(api_config)?;
1037 },
1038 ConfigInner::Default(default_config) => {
1039 this.visit_default_config(default_config)?;
1040 },
1041 }
1042 Ok(())
1043 }
1044
1045 fn visit_graphql_config(this, d: &GraphQLConfig){
1046 Ok(())
1047 }
1048
1049
1050 fn visit_api_config(this, d: &ApiConfig){
1051 for m in d.middleware.iter(){
1052 for v in m.args.iter(){
1053 this.visit_expr(v)?;
1054 }
1055 }
1056 this.visit_permission(&d.permissions)?;
1057 Ok(())
1058 }
1059
1060 fn visit_default_config(this, d: &DefaultConfig) {
1061 this.visit_expr(&d.namespace)?;
1062 this.visit_expr(&d.database)?;
1063 Ok(())
1064 }
1065
1066 fn visit_define_access(this, d: &DefineAccessStatement) {
1067 this.visit_expr(&d.name)?;
1068 this.visit_access_type(&d.access_type)?;
1069 if let Some(v) = d.authenticate.as_ref(){
1070 this.visit_expr(v)?;
1071 }
1072 if let Some(v) = d.context.as_ref(){
1073 this.visit_expr(v)?;
1074 }
1075
1076 this.visit_expr(&d.duration.grant)?;
1077 this.visit_expr(&d.duration.token)?;
1078 this.visit_expr(&d.duration.session)?;
1079 this.visit_expr(&d.comment)?;
1080 Ok(())
1081 }
1082
1083 fn visit_access_type(this, a: &AccessType) {
1084 match a {
1085 AccessType::Record(r) => { this.visit_record_access(r)?; },
1086 AccessType::Jwt(j) => { this.visit_jwt_access(j)?; },
1087 AccessType::Bearer(b) => { this.visit_bearer_access(b)?; },
1088 }
1089 Ok(())
1090 }
1091
1092 fn visit_record_access(this, r: &RecordAccess){
1093 if let Some(e) = r.signup.as_ref(){
1094 this.visit_expr(e)?
1095 }
1096 if let Some(e) = r.signin.as_ref(){
1097 this.visit_expr(e)?
1098 }
1099
1100 this.visit_jwt_access(&r.jwt)?;
1101 if let Some(b) = r.bearer.as_ref(){
1102 this.visit_bearer_access(b)?;
1103 }
1104 Ok(())
1105 }
1106
1107 fn visit_jwt_access(this, j: &JwtAccess){
1108 match j.verify{
1109 JwtAccessVerify::Key(ref k) => {
1110 this.visit_expr(&k.key)?
1111
1112 },
1113 JwtAccessVerify::Jwks(ref j) => {
1114 this.visit_expr(&j.url)?
1115 },
1116 }
1117
1118 if let Some(i) = j.issue.as_ref(){
1119 this.visit_expr(&i.key)?
1120 }
1121
1122 if let Some(aud) = j.audience.as_ref(){
1123 for a in aud {
1124 this.visit_expr(a)?
1125 }
1126 }
1127
1128 Ok(())
1129 }
1130
1131 fn visit_bearer_access(this, r: &BearerAccess){
1132 this.visit_jwt_access(&r.jwt)?;
1133 Ok(())
1134 }
1135
1136 fn visit_define_model(this, d: &DefineModelStatement) {
1137 this.visit_permission(&d.permissions)?;
1138 this.visit_expr(&d.comment)?;
1139 Ok(())
1140 }
1141
1142 fn visit_define_module(this, d: &DefineModuleStatement) {
1143 this.visit_permission(&d.permissions)?;
1144 this.visit_expr(&d.comment)?;
1145 Ok(())
1146 }
1147
1148 fn visit_define_user(this, d: &DefineUserStatement) {
1149 this.visit_expr(&d.name)?;
1150 this.visit_expr(&d.duration.token)?;
1151 this.visit_expr(&d.duration.session)?;
1152 this.visit_expr(&d.comment)?;
1153 Ok(())
1154 }
1155
1156 fn visit_define_index(this, d: &DefineIndexStatement) {
1157 this.visit_expr(&d.name)?;
1158 this.visit_expr(&d.what)?;
1159 for c in d.cols.iter(){
1160 this.visit_expr(c)?;
1161 }
1162 this.visit_expr(&d.comment)?;
1163 Ok(())
1164 }
1165
1166 fn visit_define_field(this, d: &DefineFieldStatement) {
1167 this.visit_expr(&d.name)?;
1168 this.visit_expr(&d.what)?;
1169 if let Some(k) = d.field_kind.as_ref(){
1170 this.visit_kind(k)?;
1171 }
1172 if let Some(v) = d.value.as_ref(){
1173 this.visit_expr(v)?;
1174 }
1175 if let Some(v) = d.assert.as_ref(){
1176 this.visit_expr(v)?;
1177 }
1178 if let Some(v) = d.computed.as_ref(){
1179 this.visit_expr(v)?;
1180 }
1181 match d.default{
1182 DefineDefault::None => {},
1183 DefineDefault::Always(ref expr) |
1184 DefineDefault::Set(ref expr) => this.visit_expr(expr)?,
1185 }
1186 this.visit_permissions(&d.permissions)?;
1187 if let Some(r) = d.reference.as_ref(){
1188 this.visit_reference(r)?;
1189 }
1190 this.visit_expr(&d.comment)?;
1191 Ok(())
1192 }
1193
1194 fn visit_reference(this, d: &Reference){
1195 this.visit_delete_strategy(&d.on_delete)
1196
1197 }
1198
1199 fn visit_delete_strategy(this, d: &ReferenceDeleteStrategy){
1200 match d {
1201 ReferenceDeleteStrategy::Reject |
1202 ReferenceDeleteStrategy::Ignore |
1203 ReferenceDeleteStrategy::Cascade |
1204 ReferenceDeleteStrategy::Unset => {},
1205 ReferenceDeleteStrategy::Custom(value) => {
1206 this.visit_expr(value)?;
1207 },
1208
1209 }
1210 Ok(())
1211 }
1212
1213
1214 fn visit_define_event(this, d: &DefineEventStatement){
1215 this.visit_expr(&d.name)?;
1216 this.visit_expr(&d.target_table)?;
1217 this.visit_expr(&d.when)?;
1218 for v in d.then.iter(){
1219 this.visit_expr(v)?;
1220 }
1221 this.visit_expr(&d.comment)?;
1222 Ok(())
1223 }
1224
1225 fn visit_define_table(this, d: &DefineTableStatement){
1226 this.visit_expr(&d.name)?;
1227 if let Some(v) = d.view.as_ref(){
1228 this.visit_view(v)?;
1229 }
1230 this.visit_permissions(&d.permissions)?;
1231 this.visit_expr(&d.comment)?;
1232 this.visit_table_type(&d.table_type)?;
1233
1234 Ok(())
1235 }
1236
1237 fn visit_table_type(this, t: &TableType){
1238 match t {
1239 TableType::Any |
1240 TableType::Normal => {}
1241 TableType::Relation(relation) => {
1242 this.visit_relation(relation)?;
1243 },
1244 }
1245 Ok(())
1246 }
1247
1248 fn visit_relation(this, r: &Relation){
1249 Ok(())
1250 }
1251
1252 fn visit_permissions(this, d: &Permissions){
1253 this.visit_permission(&d.select)?;
1254 this.visit_permission(&d.create)?;
1255 this.visit_permission(&d.update)?;
1256 this.visit_permission(&d.delete)?;
1257 Ok(())
1258 }
1259
1260 fn visit_view(this, v: &View){
1261 this.visit_fields(&v.expr)?;
1262
1263 if let Some(c) = v.cond.as_ref(){
1264 this.visit_expr(&c.0)?;
1265 }
1266
1267 if let Some(g) = v.group.as_ref(){
1268 for g in g.0.iter(){
1269 this.visit_idiom(&g.0)?
1270 }
1271 }
1272
1273 Ok(())
1274 }
1275
1276 fn visit_define_param(this, d: &DefineParamStatement){
1277 this.visit_expr(&d.value)?;
1278 this.visit_expr(&d.comment)?;
1279 this.visit_permission(&d.permissions)?;
1280 Ok(())
1281 }
1282
1283 fn visit_define_analyzer(this, d: &DefineAnalyzerStatement){
1284 this.visit_expr(&d.name)?;
1285 this.visit_expr(&d.comment)?;
1286 Ok(())
1287 }
1288
1289 fn visit_define_function(this, d: &DefineFunctionStatement){
1290 for (_, k) in d.args.iter(){
1291 this.visit_kind(k)?;
1292 }
1293 this.visit_block(&d.block)?;
1294 this.visit_permission(&d.permissions)?;
1295 this.visit_expr(&d.comment)?;
1296 if let Some(k) = d.returns.as_ref(){
1297 this.visit_kind(k)?;
1298 }
1299 Ok(())
1300 }
1301
1302 fn visit_permission(this, p: &Permission){
1303 match p {
1304 Permission::None |
1305 Permission::Full => {},
1306 Permission::Specific(expr) => {
1307 this.visit_expr(expr)?;
1311 },
1312 }
1313 Ok(())
1314 }
1315
1316 fn visit_define_database(this, d: &DefineDatabaseStatement){
1317 this.visit_expr(&d.name)?;
1318 this.visit_expr(&d.comment)?;
1319 Ok(())
1320 }
1321
1322 fn visit_define_namespace(this, d: &DefineNamespaceStatement){
1323 this.visit_expr(&d.name)?;
1324 this.visit_expr(&d.comment)?;
1325 Ok(())
1326 }
1327
1328 fn visit_create(this, c: &CreateStatement){
1329 for w in c.what.iter(){
1330 this.visit_expr(w)?;
1331 }
1332
1333 if let Some(data) = c.data.as_ref(){
1334 this.visit_data(data)?;
1335 }
1336
1337 if let Some(output) = c.output.as_ref(){
1338 this.visit_output(output)?;
1339 }
1340
1341 this.visit_expr(&c.timeout)?;
1342
1343 Ok(())
1344 }
1345
1346 fn visit_output(this, o: &Output){
1347 match o {
1348 Output::None |
1349 Output::Null |
1350 Output::Diff |
1351 Output::After |
1352 Output::Before => {},
1353 Output::Fields(fields) => {
1354 this.visit_fields(fields)?;
1355 },
1356 }
1357 Ok(())
1358 }
1359
1360 fn visit_data(this, d: &Data){
1361 match d {
1362 Data::EmptyExpression => {},
1363 Data::UpdateExpression(assign) |
1364 Data::SetExpression(assign) => {
1365 for a in assign{
1366 this.visit_assignment(a)?;
1367 }
1368 },
1369 Data::UnsetExpression(idioms) => {
1370 for i in idioms {
1371 this.visit_idiom(i)?;
1372 }
1373 },
1374 Data::PatchExpression(value) |
1375 Data::MergeExpression(value) |
1376 Data::ReplaceExpression(value) |
1377 Data::ContentExpression(value) |
1378 Data::SingleExpression(value) => {
1379 this.visit_expr(value)?;
1380 },
1381 Data::ValuesExpression(items) => {
1382 for (i,v) in items.iter().flat_map(|x| x.iter()){
1383 this.visit_idiom(i)?;
1384 this.visit_expr(v)?;
1385 }
1386 },
1387 }
1388 Ok(())
1389 }
1390
1391 fn visit_assignment(this, a: &Assignment){
1392 this.visit_idiom(&a.place)?;
1393 this.visit_expr(&a.value)?;
1394 Ok(())
1395 }
1396
1397 fn visit_closure(this, c: &ClosureExpr){
1398 for (_,k) in c.args.iter(){
1399 this.visit_kind(k)?;
1400 }
1401 if let Some(k) = c.returns.as_ref(){
1402 this.visit_kind(k)?;
1403 }
1404 this.visit_expr(&c.body)?;
1405 Ok(())
1406 }
1407
1408 fn visit_model(this, m: &Model) {
1409 Ok(())
1410 }
1411
1412
1413 fn visit_function_call(this, f: &FunctionCall){
1414 this.visit_function(&f.receiver)?;
1415 for a in f.arguments.iter(){
1416 this.visit_expr(a)?;
1417 }
1418 Ok(())
1419 }
1420
1421 fn visit_function(this, f: &Function){
1422 Ok(())
1423 }
1424
1425
1426 fn visit_block(this, value: &Block){
1427 for v in value.0.iter(){
1428 this.visit_expr(v)?;
1429 }
1430 Ok(())
1431
1432 }
1433
1434 fn visit_kind(this, kind: &Kind){
1435 match kind {
1436 Kind::None |
1437 Kind::Any |
1438 Kind::Null |
1439 Kind::Bool |
1440 Kind::Bytes |
1441 Kind::Datetime |
1442 Kind::Decimal |
1443 Kind::Duration |
1444 Kind::Float |
1445 Kind::Int |
1446 Kind::Number |
1447 Kind::Object |
1448 Kind::String |
1449 Kind::Uuid |
1450 Kind::Regex |
1451 Kind::Range |
1452 Kind::Record(_) |
1453 Kind::Geometry(_) |
1454 Kind::Table(_) |
1455 Kind::File(_) => {}
1456 Kind::Either(kinds) => {
1457 for k in kinds.iter() {
1458 this.visit_kind(k)?;
1459 }
1460 },
1461 Kind::Set(kind, _) => {
1462 this.visit_kind(kind)?;
1463 },
1464 Kind::Array(kind, _) => {
1465 this.visit_kind(kind)?;
1466 },
1467 Kind::Function(kinds, kind) => {
1468 if let Some(kinds) = kinds.as_ref(){
1469 for k in kinds.iter() {
1470 this.visit_kind(k)?;
1471 }
1472 }
1473 if let Some(k) = kind {
1474 this.visit_kind(k)?;
1475 }
1476 },
1477 Kind::Literal(literal) => {
1478 this.visit_kind_literal(literal)?;
1479 },
1480 }
1481 Ok(())
1482 }
1483
1484 fn visit_kind_literal(this, k: &KindLiteral){
1485 match k{
1486 KindLiteral::String(_) => {},
1487 KindLiteral::Bool(_) => {},
1488 KindLiteral::Duration(_) => {},
1489 KindLiteral::Float(_) => {},
1490 KindLiteral::Integer(_) => {},
1491 KindLiteral::Decimal(_) => {},
1492 KindLiteral::Array(kinds) => {
1493 for k in kinds.iter(){
1494 this.visit_kind(k)?;
1495 }
1496 },
1497 KindLiteral::Object(btree_map) => {
1498 for v in btree_map.values(){
1499 this.visit_kind(v)?;
1500 }
1501 },
1502 }
1503 Ok(())
1504
1505 }
1506
1507 fn visit_record_id(this, t: &RecordIdLit) {
1508 this.visit_record_id_key(&t.key)
1509 }
1510
1511 fn visit_record_id_key(this, id: &RecordIdKeyLit) {
1512 match id {
1513 RecordIdKeyLit::Number(_) => {},
1514 RecordIdKeyLit::String(_) => {},
1515 RecordIdKeyLit::Uuid(_) => {},
1516 RecordIdKeyLit::Array(array) => {
1517 for e in array.iter(){
1518 this.visit_expr(e)?;
1519 }
1520 },
1521 RecordIdKeyLit::Object(object) => {
1522 for e in object.iter(){
1523 this.visit_expr(&e.value)?;
1524 }
1525 },
1526 RecordIdKeyLit::Generate(_) => {},
1527 RecordIdKeyLit::Range(id_range) => {
1528 this.visit_record_id_key_range(id_range)?;
1529 },
1530 }
1531 Ok(())
1532 }
1533
1534 fn visit_record_id_key_range(this, id_range: &RecordIdKeyRangeLit) {
1535 match id_range.start{
1536 Bound::Included(ref x) | Bound::Excluded(ref x) => {
1537 this.visit_record_id_key(x)?;
1538 },
1539 Bound::Unbounded => {},
1540 }
1541 match id_range.end{
1542 Bound::Included(ref x) | Bound::Excluded(ref x) => {
1543 this.visit_record_id_key(x)?;
1544 },
1545 Bound::Unbounded => {},
1546 }
1547 Ok(())
1548 }
1549
1550 fn visit_param(_this, _param: &Param) {
1551 Ok(())
1552 }
1553
1554 fn visit_idiom(this, idiom: &Idiom) {
1555 for p in idiom.0.iter(){
1556 this.visit_part(p)?;
1557 }
1558 Ok(())
1559 }
1560
1561 fn visit_part(this, part: &Part) {
1562 match part{
1563 Part::All |
1564 Part::Flatten |
1565 Part::Last |
1566 Part::First |
1567 Part::Optional |
1568 Part::Field(_) |
1569 Part::Doc |
1570 Part::RepeatRecurse => {}
1571 Part::Where(value) | Part::Value(value) | Part::Start(value) => {
1572 this.visit_expr(value)?;
1573 },
1574 Part::Method(_, values) => {
1575 for v in values {
1576 this.visit_expr(v)?;
1577 }
1578 },
1579 Part::Destructure(destructure_parts) => {
1580 for p in destructure_parts.iter(){
1581 this.visit_destructure_part(p)?;
1582 }
1583 },
1584 Part::Recurse(recurse, idiom, recurse_instruction) => {
1585 this.visit_recurse(recurse)?;
1586 if let Some(idiom) = idiom.as_ref(){
1587 this.visit_idiom(idiom)?;
1588 }
1589 if let Some(instr) = recurse_instruction.as_ref(){
1590 this.visit_recurse_instruction(instr)?;
1591 }
1592 },
1593 Part::Lookup(l) => {
1594 this.visit_lookup(l)?;
1595 }
1596 }
1597 Ok(())
1598 }
1599
1600 fn visit_lookup(this, l: &Lookup){
1601 if let Some(f) = l.expr.as_ref(){
1602 this.visit_fields(f)?;
1603 }
1604 for w in l.what.iter(){
1605 this.visit_lookup_subject(w)?;
1606 }
1607
1608 if let Some(c) = l.cond.as_ref(){
1609 this.visit_expr(&c.0)?;
1610 }
1611
1612 if let Some(s) = l.split.as_ref(){
1613 for s in s.0.iter(){
1614 this.visit_idiom(&s.0)?;
1615 }
1616 }
1617
1618 if let Some(groups) = l.group.as_ref() {
1619 for g in groups.0.iter(){
1620 this.visit_idiom(&g.0)?;
1621 }
1622 }
1623
1624 if let Some(order) = l.order.as_ref(){
1625 this.visit_ordering(order)?;
1626 }
1627
1628 if let Some(limit) = l.limit.as_ref(){
1629 this.visit_expr(&limit.0)?;
1630 }
1631
1632 if let Some(start) = l.start.as_ref(){
1633 this.visit_expr(&start.0)?;
1634 }
1635
1636 if let Some(alias) = l.alias.as_ref(){
1637 this.visit_idiom(alias)?;
1638 }
1639
1640 Ok(())
1641
1642 }
1643
1644 fn visit_recurse_instruction(this, r: &RecurseInstruction){
1645 match r {
1646 RecurseInstruction::Path { ..} |
1647 RecurseInstruction::Collect { ..} => {}
1648 RecurseInstruction::Shortest { expects, .. } => {
1649 this.visit_expr(expects)?;
1650 },
1651 }
1652 Ok(())
1653 }
1654
1655 fn visit_recurse(_this, _r: &Recurse){
1656 Ok(())
1657 }
1658
1659 fn visit_destructure_part(this, p: &DestructurePart) {
1660 match p {
1661 DestructurePart::All(_) |
1662 DestructurePart::Field(_) => {},
1663 DestructurePart::Aliased(_, idiom) => {
1664 this.visit_idiom(idiom)?;
1665 },
1666 DestructurePart::Destructure(_, destructure_parts) => {
1667 for p in destructure_parts{
1668 this.visit_destructure_part(p)?;
1669 }
1670 },
1671 }
1672 Ok(())
1673 }
1674
1675
1676 fn visit_ordering(this, ordering: &Ordering){
1677 match ordering{
1678 Ordering::Random => {},
1679 Ordering::Order(order_list) => {
1680 for o in order_list.0.iter(){
1681 this.visit_idiom(&o.value)?;
1682 }
1683 },
1684 }
1685 Ok(())
1686 }
1687
1688 fn visit_fields(this, fields: &Fields) {
1689 match fields {
1690 Fields::Value(field) => {
1691 this.visit_selector(field)?;
1692 },
1693 Fields::Select(fields) => {
1694 for f in fields.iter(){
1695 this.visit_field(f)?;
1696 }
1697 },
1698 }
1699
1700 Ok(())
1701 }
1702
1703 fn visit_field(this, field: &Field){
1704 match field {
1705 Field::All => {},
1706 Field::Single(s) => {
1707 this.visit_selector(s)?;
1708 },
1709 }
1710 Ok(())
1711 }
1712
1713 fn visit_selector(this, selector: &Selector){
1714 this.visit_expr(&selector.expr)?;
1715 if let Some(alias) = &selector.alias {
1716 this.visit_idiom(alias)?;
1717 }
1718 Ok(())
1719 }
1720
1721 fn visit_lookup_subject(this, subject: &LookupSubject){
1722 match subject{
1723 LookupSubject::Table { .. } => {},
1724 LookupSubject::Range { range, .. } => {
1725 this.visit_record_id_key_range(range)?;
1726 },
1727
1728 }
1729 Ok(())
1730 }
1731}
1732
1733implement_visitor_mut! {
1734 fn visit_mut_top_level_expr(this, value: &mut TopLevelExpr) {
1735 match value {
1736 TopLevelExpr::Begin => {},
1737 TopLevelExpr::Cancel => {},
1738 TopLevelExpr::Commit => {},
1739 TopLevelExpr::Access(s) => {this.visit_mut_access(s)? },
1740 TopLevelExpr::Kill(s) => {this.visit_mut_kill(s)?; },
1741 TopLevelExpr::Live(s) => {this.visit_mut_live(s)?; },
1742 TopLevelExpr::Option(s) =>{ this.visit_mut_option(s)?; },
1743 TopLevelExpr::Use(s) => {this.visit_mut_use(s)?; },
1744 TopLevelExpr::Show(s) => {this.visit_mut_show(s)?; },
1745 TopLevelExpr::Expr(e) => {this.visit_mut_expr(e)?; },
1746 }
1747 Ok(())
1748 }
1749
1750 fn visit_mut_access(this, a: &mut AccessStatement){
1751 match a {
1752 AccessStatement::Grant(a) => {
1753 this.visit_mut_access_grant(a)?;
1754 },
1755 AccessStatement::Show(a) => {
1756 this.visit_mut_access_show(a)?;
1757 },
1758 AccessStatement::Revoke(a) => {
1759 this.visit_mut_access_revoke(a)?;
1760 },
1761 AccessStatement::Purge(a) => {
1762 this.visit_mut_access_purge(a)?;
1763 },
1764 }
1765 Ok(())
1766 }
1767
1768 fn visit_mut_access_grant(this, a: &mut AccessStatementGrant){
1769 this.visit_mut_access_subject(&mut a.subject)?;
1770 Ok(())
1771 }
1772
1773 fn visit_mut_access_subject(this, s: &mut Subject){
1774 match s{
1775 Subject::Record(r) => {
1776 this.visit_mut_record_id(r)?;
1777 },
1778 Subject::User(_) => { }
1779 }
1780 Ok(())
1781 }
1782
1783 fn visit_mut_access_show(this, a: &mut AccessStatementShow){
1784 if let Some(c) = a.cond.as_mut(){
1785 this.visit_mut_expr(&mut c.0)?;
1786 }
1787 Ok(())
1788 }
1789 fn visit_mut_access_revoke(this, a: &mut AccessStatementRevoke){
1790 if let Some(c) = a.cond.as_mut(){
1791 this.visit_mut_expr(&mut c.0)?;
1792 }
1793 Ok(())
1794 }
1795 fn visit_mut_access_purge(this, a: &mut AccessStatementPurge){
1796 Ok(())
1797 }
1798
1799
1800 fn visit_mut_kill(this, i: &mut KillStatement){
1801 this.visit_mut_expr(&mut i.id)?;
1802 Ok(())
1803 }
1804
1805 fn visit_mut_live(this, l: &mut LiveStatement){
1806 match &mut l.fields{
1807 LiveFields::Diff => {},
1808 LiveFields::Select(x) => {
1809 this.visit_mut_fields(x)?;
1810 }
1811 }
1812 this.visit_mut_expr(&mut l.what)?;
1813 if let Some(c) = l.cond.as_mut(){
1814 this.visit_mut_expr(&mut c.0)?;
1815 }
1816 if let Some(f) = l.fetch.as_mut(){
1817 for f in f.iter_mut(){
1818 this.visit_mut_expr(&mut f.0)?;
1819 }
1820 }
1821
1822 Ok(())
1823 }
1824
1825 fn visit_mut_option(this, i: &mut OptionStatement){
1826 Ok(())
1827 }
1828
1829 fn visit_mut_show(this, s: &mut ShowStatement){
1830 Ok(())
1831 }
1832
1833 fn visit_mut_expr(this, s: &mut Expr){
1834 match s {
1835 Expr::Literal(literal) => {
1836 this.visit_mut_literal(literal)?;
1837 }
1838 Expr::Param(p) => {
1839 this.visit_mut_param(p)?;
1840 }
1841 Expr::Table(_) |
1842 Expr::Mock(_) |
1843 Expr::Constant(_) |
1844 Expr::Break |
1845 Expr::Continue => {},
1846 Expr::Idiom(idiom) => {
1847 this.visit_mut_idiom(idiom)?;
1848 }
1849 Expr::Block(block) => {
1850 this.visit_mut_block(block)?;
1851 }
1852 Expr::Prefix { expr, .. } => {
1853 this.visit_mut_expr(expr)?;
1854 },
1855 Expr::Postfix { expr, op } => {
1856 this.visit_mut_expr(expr)?;
1857 match op {
1859 crate::expr::operator::PostfixOperator::Range
1860 | crate::expr::operator::PostfixOperator::RangeSkip => {},
1861 crate::expr::operator::PostfixOperator::MethodCall(_, args)
1862 | crate::expr::operator::PostfixOperator::Call(args) => {
1863 for a in args.iter_mut(){
1864 this.visit_mut_expr(a)?;
1865 }
1866 }
1867 }
1868 },
1869 Expr::Binary { left, right, .. } => {
1870 this.visit_mut_expr(left)?;
1871 this.visit_mut_expr(right)?;
1872 },
1873 Expr::FunctionCall(f) => {
1874 this.visit_mut_function_call(f)?;
1875 },
1876 Expr::Closure(c) => {
1877 this.visit_mut_closure(c)?;
1878 },
1879 Expr::Return(o) => {
1880 this.visit_mut_output_stmt(o)?;
1881 },
1882 Expr::Throw(e) => {
1883 this.visit_mut_expr(e)?;
1884 },
1885 Expr::IfElse(s) => {
1886 this.visit_mut_if_else(s)?;
1887 },
1888 Expr::Select(s) => { this.visit_mut_select(s)?; },
1889 Expr::Create(s) => { this.visit_mut_create(s)?; },
1890 Expr::Update(s) => { this.visit_mut_update(s)?; },
1891 Expr::Upsert(s) => { this.visit_mut_upsert(s)?; },
1892 Expr::Delete(s) => { this.visit_mut_delete(s)?; },
1893 Expr::Relate(s) => { this.visit_mut_relate(s)?; },
1894 Expr::Insert(s) => { this.visit_mut_insert(s)?; },
1895 Expr::Define(s) => { this.visit_mut_define(s)?; },
1896 Expr::Remove(s) => { this.visit_mut_remove(s)?; },
1897 Expr::Rebuild(s) => {
1898 this.visit_mut_rebuild(s)?;
1899 },
1900 Expr::Alter(s) => {
1901 this.visit_mut_alter(s)?;
1902 },
1903 Expr::Info(s) => {
1904 this.visit_mut_info(s)?;
1905 },
1906 Expr::Foreach(s) => {
1907 this.visit_mut_foreach(s)?;
1908 },
1909 Expr::Let(s) => {
1910 this.visit_mut_set(s)?;
1911 },
1912 Expr::Sleep(s) => {
1913 this.visit_mut_sleep(s)?;
1914 },
1915 Expr::Explain { statement, .. } => {
1916 this.visit_mut_expr(statement)?;
1917 },
1918 Expr::Match(plan) => {
1919 use crate::expr::match_plan::{MatchStage, MutationStage, UpdateData};
1920 for stage in plan.stages.iter_mut(){
1923 match stage {
1924 MatchStage::Read(clause) => {
1925 for predicate in clause.predicates.iter_mut(){
1926 this.visit_mut_expr(&mut predicate.expr)?;
1927 }
1928 }
1929 MatchStage::Mutate(MutationStage::Update { data, .. }) => match data {
1930 UpdateData::Set(assignments) => {
1931 for (_, value) in assignments.iter_mut(){
1932 this.visit_mut_expr(value)?;
1933 }
1934 }
1935 UpdateData::Unset(_) => {}
1936 UpdateData::Content(expr) => this.visit_mut_expr(expr)?,
1937 },
1938 MatchStage::Mutate(MutationStage::Delete { .. }) => {}
1939 MatchStage::Mutate(MutationStage::Insert(insert)) => {
1940 for node in insert.nodes.iter_mut(){
1941 this.visit_mut_expr(&mut node.props)?;
1942 }
1943 for edge in insert.edges.iter_mut(){
1944 this.visit_mut_expr(&mut edge.props)?;
1945 }
1946 }
1947 }
1948 }
1949 if let Some(output) = plan.output.as_mut(){
1950 for column in output.columns.iter_mut(){
1951 this.visit_mut_expr(&mut column.expr)?;
1952 }
1953 for order in output.order.iter_mut(){
1954 this.visit_mut_expr(&mut order.expr)?;
1955 }
1956 if let Some(skip) = output.skip.as_mut(){
1957 this.visit_mut_expr(skip)?;
1958 }
1959 if let Some(limit) = output.limit.as_mut(){
1960 this.visit_mut_expr(limit)?;
1961 }
1962 }
1963 },
1964 }
1965
1966 Ok(())
1967 }
1968
1969 fn visit_mut_literal(this, s: &mut Literal){
1970 match s {
1971 Literal::None |
1972 Literal::Null |
1973 Literal::UnboundedRange |
1974 Literal::Bool(_) |
1975 Literal::Float(_) |
1976 Literal::Integer(_) |
1977 Literal::Decimal(_) |
1978 Literal::String(_) |
1979 Literal::Bytes(_) |
1980 Literal::Regex(_) |
1981 Literal::Datetime(_) |
1982 Literal::Duration(_) |
1983 Literal::Uuid(_) |
1984 Literal::File(_) |
1985 Literal::Geometry(_) => {},
1986 Literal::RecordId(r) => {
1987 this.visit_mut_record_id(r)?;
1988 },
1989 Literal::Array(exprs) => {
1990 for expr in exprs.iter_mut() {
1991 this.visit_mut_expr(expr)?;
1992 }
1993 },
1994 Literal::Set(exprs) => {
1995 for expr in exprs.iter_mut() {
1996 this.visit_mut_expr(expr)?;
1997 }
1998 },
1999 Literal::Object(items) => {
2000 for entry in items{
2001 this.visit_mut_expr(&mut entry.value)?
2002 }
2003 },
2004 }
2005
2006 Ok(())
2007 }
2008
2009 fn visit_mut_alter(this, a: &mut AlterStatement){
2010 match a {
2011 AlterStatement::System(a)=>{ this.visit_mut_alter_system(a)?;},
2012 AlterStatement::Namespace(a)=>{ this.visit_mut_alter_namespace(a)?;},
2013 AlterStatement::Database(a)=>{ this.visit_mut_alter_database(a)?;},
2014 AlterStatement::Table(a)=>{ this.visit_mut_alter_table(a)?;},
2015 AlterStatement::Event(a)=>{ this.visit_mut_alter_event(a)?;},
2016 AlterStatement::Index(a)=>{ this.visit_mut_alter_index(a)?;},
2017 AlterStatement::Sequence(a) => { this.visit_mut_alter_sequence(a)?; },
2018 AlterStatement::Field(a) => { this.visit_mut_alter_field(a)?; },
2019 AlterStatement::Param(a) => { this.visit_mut_alter_param(a)?; },
2020 AlterStatement::Bucket(a) => { this.visit_mut_alter_bucket(a)?; },
2021 AlterStatement::Config(a) => { this.visit_mut_alter_config(a)?; },
2022 AlterStatement::Analyzer(a) => { this.visit_mut_alter_analyzer(a)?; },
2023 AlterStatement::Function(a) => { this.visit_mut_alter_function(a)?; },
2024 AlterStatement::Access(a) => { this.visit_mut_alter_access(a)?; },
2025 AlterStatement::User(a) => { this.visit_mut_alter_user(a)?; },
2026 AlterStatement::Api(a) => { this.visit_mut_alter_api(a)?; },
2027 AlterStatement::Module(a) => { this.visit_mut_alter_module(a)?; },
2028 }
2029 Ok(())
2030 }
2031
2032 fn visit_mut_alter_module(this, a: &mut AlterModuleStatement){
2033 if let Some(ref mut p) = a.permissions {
2034 this.visit_mut_permission(p)?;
2035 }
2036 Ok(())
2037 }
2038
2039 fn visit_mut_alter_user(this, a: &mut AlterUserStatement){
2040 this.visit_mut_expr(&mut a.name)?;
2041 Ok(())
2042 }
2043
2044 fn visit_mut_alter_api(this, a: &mut AlterApiStatement){
2045 for clause in &mut a.clauses {
2046 match clause {
2047 AlterApiClause::ForAny { fallback, .. } => {
2048 if let AlterKind::Set(x) = fallback {
2049 this.visit_mut_expr(x)?;
2050 }
2051 }
2052 AlterApiClause::SetAction(action) => {
2053 this.visit_mut_expr(&mut action.action)?;
2054 }
2055 AlterApiClause::DropAction { .. } => {}
2056 }
2057 }
2058 Ok(())
2059 }
2060
2061 fn visit_mut_alter_access(this, a: &mut AlterAccessStatement){
2062 this.visit_mut_expr(&mut a.name)?;
2063 match a.authenticate {
2064 AlterKind::None |
2065 AlterKind::Drop => {},
2066 AlterKind::Set(ref mut x) => this.visit_mut_expr(x)?,
2067 }
2068 match a.context {
2069 AlterKind::None |
2070 AlterKind::Drop => {},
2071 AlterKind::Set(ref mut x) => this.visit_mut_expr(x)?,
2072 }
2073 Ok(())
2074 }
2075
2076 fn visit_mut_alter_system(this, a: &mut AlterSystemStatement){
2077 Ok(())
2078 }
2079
2080 fn visit_mut_alter_namespace(this, a: &mut AlterNamespaceStatement){
2081 Ok(())
2082 }
2083
2084 fn visit_mut_alter_database(this, a: &mut AlterDatabaseStatement){
2085 Ok(())
2086 }
2087
2088 fn visit_mut_alter_table(this, a: &mut AlterTableStatement){
2089 this.visit_mut_expr(&mut a.name)?;
2090 if let Some(p) = a.permissions.as_mut(){
2091 this.visit_mut_permissions(p)?;
2092 }
2093 Ok(())
2094 }
2095
2096 fn visit_mut_alter_event(this, a: &mut AlterEventStatement){
2097 this.visit_mut_expr(&mut a.name)?;
2098 this.visit_mut_expr(&mut a.what)?;
2099 match a.when {
2100 AlterKind::None |
2101 AlterKind::Drop => {},
2102 AlterKind::Set(ref mut x) => this.visit_mut_expr(x)?,
2103 }
2104 match a.then {
2105 AlterKind::None |
2106 AlterKind::Drop => {},
2107 AlterKind::Set(ref mut v) => {
2108 for x in v.iter_mut() {
2109 this.visit_mut_expr(x)?;
2110 }
2111 },
2112 }
2113 Ok(())
2114 }
2115
2116 fn visit_mut_alter_index(this, a: &mut AlterIndexStatement){
2117 this.visit_mut_expr(&mut a.name)?;
2118 this.visit_mut_expr(&mut a.table)?;
2119 Ok(())
2120 }
2121
2122 fn visit_mut_alter_param(this, a: &mut AlterParamStatement){
2123 if let Some(ref mut x) = a.value {
2124 this.visit_mut_expr(x)?;
2125 }
2126 if let Some(ref mut p) = a.permissions {
2127 this.visit_mut_permission(p)?;
2128 }
2129 Ok(())
2130 }
2131
2132 fn visit_mut_alter_bucket(this, a: &mut AlterBucketStatement){
2133 this.visit_mut_expr(&mut a.name)?;
2134 if let Some(ref mut p) = a.permissions {
2135 this.visit_mut_permission(p)?;
2136 }
2137 Ok(())
2138 }
2139
2140 fn visit_mut_alter_config(this, a: &mut AlterConfigStatement){
2141 this.visit_mut_config_inner(&mut a.inner)?;
2142 Ok(())
2143 }
2144
2145 fn visit_mut_alter_analyzer(this, a: &mut AlterAnalyzerStatement){
2146 this.visit_mut_expr(&mut a.name)?;
2147 Ok(())
2148 }
2149
2150 fn visit_mut_alter_function(this, a: &mut AlterFunctionStatement){
2151 if let Some(ref mut p) = a.permissions {
2152 this.visit_mut_permission(p)?;
2153 }
2154 Ok(())
2155 }
2156
2157 fn visit_mut_alter_sequence(this, a: &mut AlterSequenceStatement){
2158 this.visit_mut_expr(&mut a.name)?;
2159 if let Some(ref mut t) = a.timeout {
2160 this.visit_mut_expr(t)?;
2161 }
2162 Ok(())
2163 }
2164
2165 fn visit_mut_alter_field(this, a: &mut AlterFieldStatement){
2166 this.visit_mut_expr(&mut a.name)?;
2167 this.visit_mut_expr(&mut a.what)?;
2168
2169 match a.value {
2170 AlterKind::None |
2171 AlterKind::Drop => {},
2172 AlterKind::Set(ref mut x) => this.visit_mut_expr(x)?,
2173 }
2174
2175 match a.assert{
2176 AlterKind::None |
2177 AlterKind::Drop => {},
2178 AlterKind::Set(ref mut x) => this.visit_mut_expr(x)?,
2179 }
2180
2181 match a.default{
2182 AlterDefault::None |
2183 AlterDefault::Drop => {},
2184 AlterDefault::Set(ref mut x) => this.visit_mut_expr(x)?,
2185 AlterDefault::Always(ref mut x) => this.visit_mut_expr(x)?,
2186 }
2187
2188 if let Some(p) = a.permissions.as_mut(){
2189 this.visit_mut_permissions(p)?;
2190 }
2191
2192 match a.reference{
2193 AlterKind::None |
2194 AlterKind::Drop => {},
2195 AlterKind::Set(ref mut x) => this.visit_mut_reference(x)?,
2196 }
2197
2198 Ok(())
2199 }
2200
2201 fn visit_mut_upsert(this, u: &mut UpsertStatement){
2202 for v in u.what.iter_mut(){
2203 this.visit_mut_expr(v)?;
2204 }
2205 if let Some(d) = u.data.as_mut(){
2206 this.visit_mut_data(d)?;
2207 }
2208 if let Some(o) = u.output.as_mut(){
2209 this.visit_mut_output(o)?;
2210 }
2211 if let Some(c) = u.cond.as_mut(){
2212 this.visit_mut_expr(&mut c.0)?;
2213 }
2214 Ok(())
2215
2216 }
2217
2218 fn visit_mut_rebuild(this, r: &mut RebuildStatement){
2219 Ok(())
2220 }
2221
2222 fn visit_mut_use(this, t: &mut UseStatement){
2223 Ok(())
2224 }
2225
2226 fn visit_mut_update(this, u: &mut UpdateStatement){
2227 for v in u.what.iter_mut(){
2228 this.visit_mut_expr(v)?;
2229 }
2230 if let Some(d) = u.data.as_mut(){
2231 this.visit_mut_data(d)?;
2232 }
2233 if let Some(o) = u.output.as_mut(){
2234 this.visit_mut_output(o)?;
2235 }
2236 if let Some(c) = u.cond.as_mut(){
2237 this.visit_mut_expr(&mut c.0)?;
2238 }
2239 Ok(())
2240
2241 }
2242
2243 fn visit_mut_sleep(this, s: &mut SleepStatement){
2244 Ok(())
2245 }
2246
2247 fn visit_mut_set(this, s: &mut SetStatement){
2248 if let Some(k) = s.kind.as_mut(){
2249 this.visit_mut_kind(k)?;
2250 }
2251 this.visit_mut_expr(&mut s.what)?;
2252 Ok(())
2253 }
2254
2255 fn visit_mut_select(this, s: &mut SelectStatement){
2256 this.visit_mut_fields(&mut s.fields)?;
2257 for o in s.omit.iter_mut(){
2258 this.visit_mut_expr(o)?;
2259 }
2260 for v in s.what.iter_mut(){
2261 this.visit_mut_expr(v)?;
2262 }
2263 if let Some(c) = s.cond.as_mut(){
2264 this.visit_mut_expr(&mut c.0)?;
2265 }
2266 if let Some(s) = s.split.as_mut(){
2267 for s in s.0.iter_mut(){
2268 this.visit_mut_idiom(&mut s.0)?;
2269 }
2270 }
2271 if let Some(g) = s.group.as_mut(){
2272 for g in g.0.iter_mut(){
2273 this.visit_mut_idiom(&mut g.0)?;
2274 }
2275 }
2276 if let Some(o) = s.order.as_mut(){
2277 this.visit_mut_ordering(o)?;
2278 }
2279 if let Some(l) = s.limit.as_mut(){
2280 this.visit_mut_expr(&mut l.0)?;
2281 }
2282 if let Some(f) = s.fetch.as_mut(){
2283 for f in f.iter_mut(){
2284 this.visit_mut_expr(&mut f.0)?;
2285 }
2286 }
2287 this.visit_mut_expr(&mut s.version)?;
2288
2289 Ok(())
2290 }
2291
2292 fn visit_mut_remove(this, r: &mut RemoveStatement){
2293 match r {
2294 RemoveStatement::Namespace(r) => {
2295 this.visit_mut_remove_namespace(r)?;
2296 },
2297 RemoveStatement::Database(r) => {
2298 this.visit_mut_remove_database(r)?;
2299 },
2300 RemoveStatement::Function(r) => {
2301 this.visit_mut_remove_function(r)?;
2302 },
2303 RemoveStatement::Analyzer(r) => {
2304 this.visit_mut_remove_analyzer(r)?;
2305 },
2306 RemoveStatement::Access(r) => {
2307 this.visit_mut_remove_access(r)?;
2308 },
2309 RemoveStatement::Param(r) => {
2310 this.visit_mut_remove_param(r)?;
2311 },
2312 RemoveStatement::Table(r) => {
2313 this.visit_mut_remove_table(r)?;
2314 },
2315 RemoveStatement::Event(r) => {
2316 this.visit_mut_remove_event(r)?;
2317 },
2318 RemoveStatement::Field(r) => {
2319 this.visit_mut_remove_field(r)?;
2320 },
2321 RemoveStatement::Index(r) => {
2322 this.visit_mut_remove_index(r)?;
2323 },
2324 RemoveStatement::User(r) => {
2325 this.visit_mut_remove_user(r)?;
2326 },
2327 RemoveStatement::Model(r) => {
2328 this.visit_mut_remove_model(r)?;
2329 },
2330 RemoveStatement::Api(r) => {
2331 this.visit_mut_remove_api(r)?;
2332 },
2333 RemoveStatement::Bucket(r) => {
2334 this.visit_mut_remove_bucket(r)?;
2335 },
2336 RemoveStatement::Sequence(r) => {
2337 this.visit_mut_remove_sequence(r)?;
2338 },
2339 RemoveStatement::Module(r) => {
2340 this.visit_mut_remove_module(r)?;
2341 },
2342 RemoveStatement::Config(r) => {
2343 this.visit_mut_remove_config(r)?;
2344 },
2345 }
2346 Ok(())
2347 }
2348
2349 fn visit_mut_remove_namespace(this, r: &mut RemoveNamespaceStatement){
2350 this.visit_mut_expr(&mut r.name)?;
2351 Ok(())
2352 }
2353
2354 fn visit_mut_remove_database(this, r: &mut RemoveDatabaseStatement){
2355 this.visit_mut_expr(&mut r.name)?;
2356 Ok(())
2357 }
2358
2359 fn visit_mut_remove_function(this, r: &mut RemoveFunctionStatement){
2360 Ok(())
2361 }
2362
2363 fn visit_mut_remove_module(this, r: &mut RemoveModuleStatement){
2364 Ok(())
2365 }
2366
2367 fn visit_mut_remove_config(this, r: &mut RemoveConfigStatement){
2368 Ok(())
2369 }
2370
2371 fn visit_mut_remove_analyzer(this, r: &mut RemoveAnalyzerStatement){
2372 this.visit_mut_expr(&mut r.name)?;
2373 Ok(())
2374 }
2375
2376 fn visit_mut_remove_access(this, r: &mut RemoveAccessStatement){
2377 this.visit_mut_expr(&mut r.name)?;
2378 Ok(())
2379 }
2380
2381 fn visit_mut_remove_param(this, r: &mut RemoveParamStatement){
2382 Ok(())
2383 }
2384
2385 fn visit_mut_remove_table(this, r: &mut RemoveTableStatement){
2386 this.visit_mut_expr(&mut r.name)?;
2387 Ok(())
2388 }
2389
2390 fn visit_mut_remove_event(this, r: &mut RemoveEventStatement){
2391 this.visit_mut_expr(&mut r.name)?;
2392 Ok(())
2393 }
2394
2395 fn visit_mut_remove_field(this, r: &mut RemoveFieldStatement){
2396 this.visit_mut_expr(&mut r.name)?;
2397 Ok(())
2398 }
2399
2400 fn visit_mut_remove_index(this, r: &mut RemoveIndexStatement){
2401 this.visit_mut_expr(&mut r.name)?;
2402 this.visit_mut_expr(&mut r.what)?;
2403 Ok(())
2404 }
2405
2406 fn visit_mut_remove_user(this, r: &mut RemoveUserStatement){
2407 this.visit_mut_expr(&mut r.name)?;
2408 Ok(())
2409 }
2410
2411 fn visit_mut_remove_model(this, r: &mut RemoveModelStatement){
2412 Ok(())
2413 }
2414
2415
2416 fn visit_mut_remove_api(this, r: &mut RemoveApiStatement){
2417 this.visit_mut_expr(&mut r.name)?;
2418 Ok(())
2419 }
2420
2421 fn visit_mut_remove_bucket(this, r: &mut RemoveBucketStatement){
2422 this.visit_mut_expr(&mut r.name)?;
2423 Ok(())
2424 }
2425
2426 fn visit_mut_remove_sequence(this, r: &mut RemoveSequenceStatement){
2427 this.visit_mut_expr(&mut r.name)?;
2428 Ok(())
2429 }
2430
2431 fn visit_mut_relate(this, o: &mut RelateStatement){
2432 this.visit_mut_expr(&mut o.through)?;
2433 this.visit_mut_expr(&mut o.from)?;
2434 this.visit_mut_expr(&mut o.to)?;
2435 if let Some(d) = o.data.as_mut(){
2436 this.visit_mut_data(d)?;
2437 }
2438 if let Some(o) = o.output.as_mut(){
2439 this.visit_mut_output(o)?;
2440 }
2441 this.visit_mut_expr(&mut o.timeout)?;
2442 Ok(())
2443 }
2444
2445 fn visit_mut_output_stmt(this, o: &mut OutputStatement){
2446 this.visit_mut_expr(&mut o.what)?;
2447 if let Some(f) = o.fetch.as_mut(){
2448 for f in f.iter_mut(){
2449 this.visit_mut_expr(&mut f.0)?;
2450 }
2451 }
2452 Ok(())
2453 }
2454
2455 fn visit_mut_insert(this, i: &mut InsertStatement){
2456 if let Some(into) = &mut i.into {
2457 this.visit_mut_expr(into)?;
2458 }
2459 this.visit_mut_data(&mut i.data)?;
2460 if let Some(update) = i.update.as_mut(){
2461 this.visit_mut_data(update)?;
2462 }
2463 if let Some(o) = i.output.as_mut(){
2464 this.visit_mut_output(o)?;
2465 }
2466 this.visit_mut_expr(&mut i.timeout)?;
2467 Ok(())
2468 }
2469
2470 fn visit_mut_info(this, i: &mut InfoStatement){
2471 match i{
2472 InfoStatement::Root(_, expr) |
2473 InfoStatement::Ns(_, expr) |
2474 InfoStatement::Db(_, expr) => {
2475 if let Some(e) = expr.as_mut(){
2476 this.visit_mut_expr(e)?;
2477 }
2478 },
2479 InfoStatement::Tb(expr, _, expr1) => {
2480 this.visit_mut_expr(expr)?;
2481 if let Some(e) = expr1.as_mut(){
2482 this.visit_mut_expr(e)?;
2483 }
2484 },
2485 InfoStatement::User(expr, base, _) => {
2486 this.visit_mut_expr(expr)?;
2487 },
2488 InfoStatement::Index(expr, expr1, _) => {
2489 this.visit_mut_expr(expr)?;
2490 this.visit_mut_expr(expr1)?;
2491 },
2492 }
2493 Ok(())
2494 }
2495
2496 fn visit_mut_if_else(this, i: &mut IfelseStatement){
2497 for e in i.exprs.iter_mut(){
2498 this.visit_mut_expr(&mut e.0)?;
2499 this.visit_mut_expr(&mut e.1)?;
2500 }
2501 if let Some(x) = i.close.as_mut(){
2502 this.visit_mut_expr(x)?;
2503 }
2504 Ok(())
2505 }
2506
2507 fn visit_mut_foreach(this, f: &mut ForeachStatement){
2508 this.visit_mut_param(&mut f.param)?;
2509 this.visit_mut_expr(&mut f.range)?;
2510 this.visit_mut_block(&mut f.block)?;
2511 Ok(())
2512 }
2513
2514 fn visit_mut_delete(this, d: &mut DeleteStatement){
2515 for v in d.what.iter_mut(){
2516 this.visit_mut_expr(v)?;
2517 }
2518 if let Some(c) = d.cond.as_mut(){
2519 this.visit_mut_expr(&mut c.0)?;
2520 }
2521 if let Some(o) = d.output.as_mut(){
2522 this.visit_mut_output(o)?;
2523 }
2524 this.visit_mut_expr(&mut d.timeout)?;
2525 Ok(())
2526 }
2527
2528 fn visit_mut_define(this, d: &mut DefineStatement){
2529 match d {
2530 DefineStatement::Namespace(d) => {
2531 this.visit_mut_define_namespace(d)?;
2532 },
2533 DefineStatement::Database(d) => {
2534 this.visit_mut_define_database(d)?;
2535 },
2536 DefineStatement::Function(d) => {
2537 this.visit_mut_define_function(d)?;
2538 },
2539 DefineStatement::Analyzer(d) => {
2540 this.visit_mut_define_analyzer(d)?;
2541 },
2542 DefineStatement::Param(d) => {
2543 this.visit_mut_define_param(d)?;
2544 },
2545 DefineStatement::Table(d) => {
2546 this.visit_mut_define_table(d)?;
2547 },
2548 DefineStatement::Event(d) => {
2549 this.visit_mut_define_event(d)?;
2550 },
2551 DefineStatement::Field(d) => {
2552 this.visit_mut_define_field(d)?;
2553 },
2554 DefineStatement::Index(d) => {
2555 this.visit_mut_define_index(d)?;
2556 },
2557 DefineStatement::User(d) => {
2558 this.visit_mut_define_user(d)?;
2559 },
2560 DefineStatement::Model(d) => {
2561 this.visit_mut_define_model(d)?;
2562 },
2563 DefineStatement::Access(d) => {
2564 this.visit_mut_define_access(d)?;
2565 },
2566 DefineStatement::Config(d) => {
2567 this.visit_mut_define_config(d)?;
2568 },
2569 DefineStatement::Api(d) => {
2570 this.visit_mut_define_api(d)?;
2571 },
2572 DefineStatement::Bucket(d) => {
2573 this.visit_mut_define_bucket(d)?;
2574 },
2575 DefineStatement::Sequence(d) => {
2576 this.visit_mut_define_sequence(d)?;
2577 },
2578 DefineStatement::Module(d) => {
2579 this.visit_mut_define_module(d)?;
2580 },
2581 }
2582 Ok(())
2583 }
2584
2585 fn visit_mut_define_sequence(this, d: &mut DefineSequenceStatement) {
2586 this.visit_mut_expr(&mut d.name)?;
2587 this.visit_mut_expr(&mut d.batch)?;
2588 this.visit_mut_expr(&mut d.start)?;
2589
2590 this.visit_mut_expr(&mut d.timeout)?;
2591 Ok(())
2592 }
2593
2594 fn visit_mut_define_bucket(this, d: &mut DefineBucketStatement) {
2595 this.visit_mut_expr(&mut d.name)?;
2596 if let Some(expr) = d.backend.as_mut(){
2597 this.visit_mut_expr(expr)?;
2598 }
2599 this.visit_mut_permission(&mut d.permissions)?;
2600 this.visit_mut_expr(&mut d.comment)?;
2601 Ok(())
2602 }
2603
2604 fn visit_mut_define_api(this, d: &mut DefineApiStatement) {
2605 this.visit_mut_expr(&mut d.path)?;
2606 for act in d.actions.iter_mut(){
2607 this.visit_mut_api_action(act)?;
2608 }
2609 if let Some(f) = d.fallback.as_mut(){
2610 this.visit_mut_expr(f)?;
2611 }
2612 this.visit_mut_api_config(&mut d.config)?;
2613 this.visit_mut_expr(&mut d.comment)?;
2614
2615 Ok(())
2616 }
2617
2618 fn visit_mut_api_action(this, a: &mut ApiAction){
2619 this.visit_mut_expr(&mut a.action)?;
2620 this.visit_mut_api_config(&mut a.config)?;
2621 Ok(())
2622 }
2623
2624
2625 fn visit_mut_define_config(this, d: &mut DefineConfigStatement) {
2626 this.visit_mut_config_inner(&mut d.inner)
2627 }
2628
2629 fn visit_mut_config_inner(this, d: &mut ConfigInner){
2630 match d {
2631 ConfigInner::GraphQL(graph_qlconfig) => {
2632 this.visit_mut_graphql_config(graph_qlconfig)?;
2633 },
2634 ConfigInner::Api(api_config) => {
2635 this.visit_mut_api_config(api_config)?;
2636 },
2637 ConfigInner::Default(default_config) => {
2638 this.visit_mut_default_config(default_config)?;
2639 },
2640 }
2641 Ok(())
2642 }
2643
2644 fn visit_mut_graphql_config(this, d: &mut GraphQLConfig){
2645 Ok(())
2646 }
2647
2648 fn visit_mut_api_config(this, d: &mut ApiConfig){
2649 for m in d.middleware.iter_mut(){
2650 for v in m.args.iter_mut(){
2651 this.visit_mut_expr(v)?;
2652 }
2653 }
2654 this.visit_mut_permission(&mut d.permissions)?;
2655 Ok(())
2656 }
2657
2658 fn visit_mut_default_config(this, d: &mut DefaultConfig) {
2659 this.visit_mut_expr(&mut d.namespace)?;
2660 this.visit_mut_expr(&mut d.database)?;
2661 Ok(())
2662 }
2663
2664 fn visit_mut_define_access(this, d: &mut DefineAccessStatement) {
2665 this.visit_mut_expr(&mut d.name)?;
2666 this.visit_mut_access_type(&mut d.access_type)?;
2667 if let Some(v) = d.authenticate.as_mut(){
2668 this.visit_mut_expr(v)?;
2669 }
2670 if let Some(v) = d.context.as_mut(){
2671 this.visit_mut_expr(v)?;
2672 }
2673 this.visit_mut_expr(&mut d.duration.grant)?;
2674 this.visit_mut_expr(&mut d.duration.token)?;
2675 this.visit_mut_expr(&mut d.duration.session)?;
2676 this.visit_mut_expr(&mut d.comment)?;
2677 Ok(())
2678 }
2679
2680 fn visit_mut_access_type(this, a: &mut AccessType) {
2681 match a {
2682 AccessType::Record(r) => { this.visit_mut_record_access(r)?; },
2683 AccessType::Jwt(j) => { this.visit_mut_jwt_access(j)?; },
2684 AccessType::Bearer(b) => { this.visit_mut_bearer_access(b)?; },
2685 }
2686 Ok(())
2687 }
2688
2689 fn visit_mut_record_access(this, r: &mut RecordAccess){
2690 if let Some(e) = r.signup.as_mut(){
2691 this.visit_mut_expr(e)?
2692 }
2693 if let Some(e) = r.signin.as_mut(){
2694 this.visit_mut_expr(e)?
2695 }
2696
2697 this.visit_mut_jwt_access(&mut r.jwt)?;
2698 if let Some(b) = r.bearer.as_mut(){
2699 this.visit_mut_bearer_access(b)?;
2700 }
2701 Ok(())
2702 }
2703
2704 fn visit_mut_jwt_access(this, j: &mut JwtAccess){
2705 match j.verify{
2706 JwtAccessVerify::Key(ref mut k) => {
2707 this.visit_mut_expr(&mut k.key)?
2708
2709 },
2710 JwtAccessVerify::Jwks(ref mut j) => {
2711 this.visit_mut_expr(&mut j.url)?
2712 },
2713 }
2714
2715 if let Some(i) = j.issue.as_mut(){
2716 this.visit_mut_expr(&mut i.key)?
2717 }
2718
2719 Ok(())
2720 }
2721
2722 fn visit_mut_bearer_access(this, r: &mut BearerAccess){
2723 this.visit_mut_jwt_access(&mut r.jwt)?;
2724 Ok(())
2725 }
2726
2727 fn visit_mut_define_model(this, d: &mut DefineModelStatement) {
2728 this.visit_mut_permission(&mut d.permissions)?;
2729 this.visit_mut_expr(&mut d.comment)?;
2730 Ok(())
2731 }
2732
2733 fn visit_mut_define_module(this, d: &mut DefineModuleStatement) {
2734 this.visit_mut_permission(&mut d.permissions)?;
2735 this.visit_mut_expr(&mut d.comment)?;
2736 Ok(())
2737 }
2738
2739 fn visit_mut_define_user(this, d: &mut DefineUserStatement) {
2740 this.visit_mut_expr(&mut d.name)?;
2741 this.visit_mut_expr(&mut d.duration.token)?;
2742 this.visit_mut_expr(&mut d.duration.session)?;
2743 this.visit_mut_expr(&mut d.comment)?;
2744 Ok(())
2745 }
2746
2747 fn visit_mut_define_index(this, d: &mut DefineIndexStatement) {
2748 this.visit_mut_expr(&mut d.name)?;
2749 this.visit_mut_expr(&mut d.what)?;
2750 for c in d.cols.iter_mut(){
2751 this.visit_mut_expr(c)?;
2752 }
2753 this.visit_mut_expr(&mut d.comment)?;
2754 Ok(())
2755 }
2756
2757 fn visit_mut_define_field(this, d: &mut DefineFieldStatement) {
2758 this.visit_mut_expr(&mut d.name)?;
2759 this.visit_mut_expr(&mut d.what)?;
2760 if let Some(k) = d.field_kind.as_mut(){
2761 this.visit_mut_kind(k)?;
2762 }
2763 if let Some(v) = d.value.as_mut(){
2764 this.visit_mut_expr(v)?;
2765 }
2766 if let Some(v) = d.assert.as_mut(){
2767 this.visit_mut_expr(v)?;
2768 }
2769 if let Some(v) = d.computed.as_mut(){
2770 this.visit_mut_expr(v)?;
2771 }
2772 match d.default{
2773 DefineDefault::None => {},
2774 DefineDefault::Always(ref mut expr) |
2775 DefineDefault::Set(ref mut expr) => this.visit_mut_expr(expr)?,
2776 }
2777 this.visit_mut_permissions(&mut d.permissions)?;
2778 if let Some(r) = d.reference.as_mut(){
2779 this.visit_mut_reference(r)?;
2780 }
2781 this.visit_mut_expr(&mut d.comment)?;
2782 Ok(())
2783 }
2784
2785 fn visit_mut_reference(this, d: &mut Reference){
2786 this.visit_mut_delete_strategy(&mut d.on_delete)
2787
2788 }
2789
2790 fn visit_mut_delete_strategy(this, d: &mut ReferenceDeleteStrategy){
2791 match d {
2792 ReferenceDeleteStrategy::Reject |
2793 ReferenceDeleteStrategy::Ignore |
2794 ReferenceDeleteStrategy::Cascade |
2795 ReferenceDeleteStrategy::Unset => {},
2796 ReferenceDeleteStrategy::Custom(value) => {
2797 this.visit_mut_expr(value)?;
2798 },
2799
2800 }
2801 Ok(())
2802 }
2803
2804
2805 fn visit_mut_define_event(this, d: &mut DefineEventStatement){
2806 this.visit_mut_expr(&mut d.name)?;
2807 this.visit_mut_expr(&mut d.target_table)?;
2808 this.visit_mut_expr(&mut d.when)?;
2809 for v in d.then.iter_mut(){
2810 this.visit_mut_expr(v)?;
2811 }
2812 this.visit_mut_expr(&mut d.comment)?;
2813 Ok(())
2814 }
2815
2816 fn visit_mut_define_table(this, d: &mut DefineTableStatement){
2817 this.visit_mut_expr(&mut d.name)?;
2818 if let Some(v) = d.view.as_mut(){
2819 this.visit_mut_view(v)?;
2820 }
2821 this.visit_mut_permissions(&mut d.permissions)?;
2822 this.visit_mut_expr(&mut d.comment)?;
2823
2824 this.visit_mut_table_type(&mut d.table_type)?;
2825
2826 Ok(())
2827 }
2828
2829 fn visit_mut_table_type(this, t: &mut TableType){
2830 match t {
2831 TableType::Any |
2832 TableType::Normal => {}
2833 TableType::Relation(relation) => {
2834 this.visit_mut_relation(relation)?;
2835 },
2836 }
2837 Ok(())
2838 }
2839
2840 fn visit_mut_relation(this, r: &mut Relation){
2841 Ok(())
2842 }
2843
2844 fn visit_mut_permissions(this, d: &mut Permissions){
2845 this.visit_mut_permission(&mut d.select)?;
2846 this.visit_mut_permission(&mut d.create)?;
2847 this.visit_mut_permission(&mut d.update)?;
2848 this.visit_mut_permission(&mut d.delete)?;
2849 Ok(())
2850 }
2851
2852 fn visit_mut_view(this, v: &mut View){
2853 this.visit_mut_fields(&mut v.expr)?;
2854
2855 if let Some(c) = v.cond.as_mut(){
2856 this.visit_mut_expr(&mut c.0)?;
2857 }
2858
2859 if let Some(g) = v.group.as_mut(){
2860 for g in g.0.iter_mut(){
2861 this.visit_mut_idiom(&mut g.0)?
2862 }
2863 }
2864
2865 Ok(())
2866 }
2867
2868 fn visit_mut_define_param(this, d: &mut DefineParamStatement){
2869 this.visit_mut_expr(&mut d.value)?;
2870 this.visit_mut_expr(&mut d.comment)?;
2871 this.visit_mut_permission(&mut d.permissions)?;
2872 Ok(())
2873 }
2874
2875 fn visit_mut_define_analyzer(this, d: &mut DefineAnalyzerStatement){
2876 this.visit_mut_expr(&mut d.name)?;
2877 this.visit_mut_expr(&mut d.comment)?;
2878 Ok(())
2879 }
2880
2881 fn visit_mut_define_function(this, d: &mut DefineFunctionStatement){
2882 for (_, k) in d.args.iter_mut(){
2883 this.visit_mut_kind(k)?;
2884 }
2885 this.visit_mut_block(&mut d.block)?;
2886 this.visit_mut_permission(&mut d.permissions)?;
2887 this.visit_mut_expr(&mut d.comment)?;
2888 if let Some(k) = d.returns.as_mut(){
2889 this.visit_mut_kind(k)?;
2890 }
2891 Ok(())
2892 }
2893
2894 fn visit_mut_permission(this, p: &mut Permission){
2895 match p {
2896 Permission::None |
2897 Permission::Full => {},
2898 Permission::Specific(expr) => {
2899 this.visit_mut_expr(expr)?;
2904 },
2905 }
2906 Ok(())
2907 }
2908
2909 fn visit_mut_define_database(this, d: &mut DefineDatabaseStatement){
2910 this.visit_mut_expr(&mut d.name)?;
2911 this.visit_mut_expr(&mut d.comment)?;
2912 Ok(())
2913 }
2914
2915 fn visit_mut_define_namespace(this, d: &mut DefineNamespaceStatement){
2916 this.visit_mut_expr(&mut d.name)?;
2917 this.visit_mut_expr(&mut d.comment)?;
2918 Ok(())
2919 }
2920
2921 fn visit_mut_create(this, c: &mut CreateStatement){
2922 for w in c.what.iter_mut(){
2923 this.visit_mut_expr(w)?;
2924 }
2925
2926 if let Some(data) = c.data.as_mut(){
2927 this.visit_mut_data(data)?;
2928 }
2929
2930 if let Some(output) = c.output.as_mut(){
2931 this.visit_mut_output(output)?;
2932 }
2933
2934 this.visit_mut_expr(&mut c.timeout)?;
2935
2936 Ok(())
2937 }
2938
2939 fn visit_mut_output(this, o: &mut Output){
2940 match o {
2941 Output::None |
2942 Output::Null |
2943 Output::Diff |
2944 Output::After |
2945 Output::Before => {},
2946 Output::Fields(fields) => {
2947 this.visit_mut_fields(fields)?;
2948 },
2949 }
2950 Ok(())
2951 }
2952
2953 fn visit_mut_data(this, d: &mut Data){
2954 match d {
2955 Data::EmptyExpression => {},
2956 Data::UpdateExpression(assign) |
2957 Data::SetExpression(assign) => {
2958 for a in assign{
2959 this.visit_mut_assignment(a)?;
2960 }
2961 },
2962 Data::UnsetExpression(idioms) => {
2963 for i in idioms {
2964 this.visit_mut_idiom(i)?;
2965 }
2966 },
2967 Data::PatchExpression(value) |
2968 Data::MergeExpression(value) |
2969 Data::ReplaceExpression(value) |
2970 Data::ContentExpression(value) |
2971 Data::SingleExpression(value) => {
2972 this.visit_mut_expr(value)?;
2973 },
2974 Data::ValuesExpression(items) => {
2975 for (i,v) in items.iter_mut().flat_map(|x| x.iter_mut()){
2976 this.visit_mut_idiom(i)?;
2977 this.visit_mut_expr(v)?;
2978 }
2979 },
2980 }
2981 Ok(())
2982 }
2983
2984 fn visit_mut_assignment(this, a: &mut Assignment){
2985 this.visit_mut_idiom(&mut a.place)?;
2986 this.visit_mut_expr(&mut a.value)?;
2987 Ok(())
2988 }
2989
2990
2991 fn visit_mut_closure(this, c: &mut ClosureExpr){
3002 for (_,k) in c.args.iter_mut(){
3003 this.visit_mut_kind(k)?;
3004 }
3005 if let Some(k) = c.returns.as_mut(){
3006 this.visit_mut_kind(k)?;
3007 }
3008 this.visit_mut_expr(&mut c.body)?;
3009 Ok(())
3010 }
3011
3012 fn visit_mut_model(this, m: &mut Model) {
3013 Ok(())
3014 }
3015
3016
3017 fn visit_mut_function_call(this, f: &mut FunctionCall){
3018 this.visit_mut_function(&mut f.receiver)?;
3019 for a in f.arguments.iter_mut(){
3020 this.visit_mut_expr(a)?;
3021 }
3022 Ok(())
3023 }
3024
3025 fn visit_mut_function(this, f: &mut Function){
3026 Ok(())
3027 }
3028
3029
3030 fn visit_mut_block(this, value: &mut Block){
3031 for v in value.0.iter_mut(){
3032 this.visit_mut_expr(v)?;
3033 }
3034 Ok(())
3035
3036 }
3037
3038 fn visit_mut_kind(this, kind: &mut Kind){
3039 match kind {
3040 Kind::None |
3041 Kind::Any |
3042 Kind::Null |
3043 Kind::Bool |
3044 Kind::Bytes |
3045 Kind::Datetime |
3046 Kind::Decimal |
3047 Kind::Duration |
3048 Kind::Float |
3049 Kind::Int |
3050 Kind::Number |
3051 Kind::Object |
3052 Kind::String |
3053 Kind::Uuid |
3054 Kind::Regex |
3055 Kind::Range |
3056 Kind::Record(_) |
3057 Kind::Geometry(_) |
3058 Kind::Table(_) |
3059 Kind::File(_) => {}
3060 Kind::Either(kinds) => {
3061 for k in kinds.iter_mut() {
3062 this.visit_mut_kind(k)?;
3063 }
3064 },
3065 Kind::Set(kind, _) => {
3066 this.visit_mut_kind(kind)?;
3067 },
3068 Kind::Array(kind, _) => {
3069 this.visit_mut_kind(kind)?;
3070 },
3071 Kind::Function(kinds, kind) => {
3072 if let Some(kinds) = kinds.as_mut(){
3073 for k in kinds.iter_mut() {
3074 this.visit_mut_kind(k)?;
3075 }
3076 }
3077 if let Some(k) = kind {
3078 this.visit_mut_kind(k)?;
3079 }
3080 },
3081 Kind::Literal(literal) => {
3082 this.visit_mut_kind_literal(literal)?;
3083 },
3084 }
3085 Ok(())
3086 }
3087
3088 fn visit_mut_kind_literal(this, k: &mut KindLiteral){
3089 match k{
3090 KindLiteral::String(_) => {},
3091 KindLiteral::Bool(_) => {},
3092 KindLiteral::Duration(_) => {},
3093 KindLiteral::Float(_) => {},
3094 KindLiteral::Integer(_) => {},
3095 KindLiteral::Decimal(_) => {},
3096 KindLiteral::Array(kinds) => {
3097 for k in kinds.iter_mut(){
3098 this.visit_mut_kind(k)?;
3099 }
3100 },
3101 KindLiteral::Object(btree_map) => {
3102 for v in btree_map.values_mut(){
3103 this.visit_mut_kind(v)?;
3104 }
3105 },
3106 }
3107 Ok(())
3108
3109 }
3110
3111 fn visit_mut_record_id(this, t: &mut RecordIdLit) {
3112 this.visit_mut_record_id_key(&mut t.key)
3113 }
3114
3115 fn visit_mut_record_id_key(this, id: &mut RecordIdKeyLit) {
3116 match id {
3117 RecordIdKeyLit::Number(_) => {},
3118 RecordIdKeyLit::String(_) => {},
3119 RecordIdKeyLit::Uuid(_) => {},
3120 RecordIdKeyLit::Array(array) => {
3121 for e in array.iter_mut(){
3122 this.visit_mut_expr(e)?;
3123 }
3124 },
3125 RecordIdKeyLit::Object(object) => {
3126 for e in object.iter_mut(){
3127 this.visit_mut_expr(&mut e.value)?;
3128 }
3129 },
3130 RecordIdKeyLit::Generate(_) => {},
3131 RecordIdKeyLit::Range(id_range) => {
3132 this.visit_mut_record_id_key_range(id_range)?;
3133 },
3134 }
3135 Ok(())
3136 }
3137
3138 fn visit_mut_record_id_key_range(this, id_range: &mut RecordIdKeyRangeLit) {
3139 match id_range.start{
3140 Bound::Included(ref mut x) | Bound::Excluded(ref mut x) => {
3141 this.visit_mut_record_id_key(x)?;
3142 },
3143 Bound::Unbounded => {},
3144 }
3145 match id_range.end{
3146 Bound::Included(ref mut x) | Bound::Excluded(ref mut x) => {
3147 this.visit_mut_record_id_key(x)?;
3148 },
3149 Bound::Unbounded => {},
3150 }
3151 Ok(())
3152 }
3153
3154 fn visit_mut_param(_this, _param: &mut Param) {
3155 Ok(())
3156 }
3157
3158 fn visit_mut_idiom(this, idiom: &mut Idiom) {
3159 for p in idiom.0.iter_mut(){
3160 this.visit_mut_part(p)?;
3161 }
3162 Ok(())
3163 }
3164
3165 fn visit_mut_part(this, part: &mut Part) {
3166 match part{
3167 Part::All |
3168 Part::Flatten |
3169 Part::Last |
3170 Part::First |
3171 Part::Optional |
3172 Part::Field(_) |
3173 Part::Doc |
3174 Part::RepeatRecurse => {}
3175 Part::Where(value) | Part::Value(value) | Part::Start(value) => {
3176 this.visit_mut_expr(value)?;
3177 },
3178 Part::Method(_, values) => {
3179 for v in values {
3180 this.visit_mut_expr(v)?;
3181 }
3182 },
3183 Part::Destructure(destructure_parts) => {
3184 for p in destructure_parts.iter_mut(){
3185 this.visit_mut_destructure_part(p)?;
3186 }
3187 },
3188 Part::Recurse(recurse, idiom, recurse_instruction) => {
3189 this.visit_mut_recurse(recurse)?;
3190 if let Some(idiom) = idiom.as_mut(){
3191 this.visit_mut_idiom(idiom)?;
3192 }
3193 if let Some(instr) = recurse_instruction.as_mut(){
3194 this.visit_mut_recurse_instruction(instr)?;
3195 }
3196 },
3197 Part::Lookup(l) => {
3198 this.visit_mut_lookup(l)?;
3199 }
3200 }
3201 Ok(())
3202 }
3203
3204 fn visit_mut_lookup(this, l: &mut Lookup){
3205 if let Some(f) = l.expr.as_mut(){
3206 this.visit_mut_fields(f)?;
3207 }
3208 for w in l.what.iter_mut(){
3209 this.visit_mut_lookup_subject(w)?;
3210 }
3211
3212 if let Some(c) = l.cond.as_mut(){
3213 this.visit_mut_expr(&mut c.0)?;
3214 }
3215
3216 if let Some(s) = l.split.as_mut(){
3217 for s in s.0.iter_mut(){
3218 this.visit_mut_idiom(&mut s.0)?;
3219 }
3220 }
3221
3222 if let Some(groups) = l.group.as_mut() {
3223 for g in groups.0.iter_mut(){
3224 this.visit_mut_idiom(&mut g.0)?;
3225 }
3226 }
3227
3228 if let Some(order) = l.order.as_mut(){
3229 this.visit_mut_ordering(order)?;
3230 }
3231
3232 if let Some(limit) = l.limit.as_mut(){
3233 this.visit_mut_expr(&mut limit.0)?;
3234 }
3235
3236 if let Some(start) = l.start.as_mut(){
3237 this.visit_mut_expr(&mut start.0)?;
3238 }
3239
3240 if let Some(alias) = l.alias.as_mut(){
3241 this.visit_mut_idiom(alias)?;
3242 }
3243
3244 Ok(())
3245
3246 }
3247
3248 fn visit_mut_recurse_instruction(this, r: &mut RecurseInstruction){
3249 match r {
3250 RecurseInstruction::Path { ..} |
3251 RecurseInstruction::Collect { ..} => {}
3252 RecurseInstruction::Shortest { expects, .. } => {
3253 this.visit_mut_expr(expects)?;
3254 },
3255 }
3256 Ok(())
3257 }
3258
3259 fn visit_mut_recurse(_this, _r: &mut Recurse){
3260 Ok(())
3261 }
3262
3263 fn visit_mut_destructure_part(this, p: &mut DestructurePart) {
3264 match p {
3265 DestructurePart::All(_) |
3266 DestructurePart::Field(_) => {},
3267 DestructurePart::Aliased(_, idiom) => {
3268 this.visit_mut_idiom(idiom)?;
3269 },
3270 DestructurePart::Destructure(_, destructure_parts) => {
3271 for p in destructure_parts{
3272 this.visit_mut_destructure_part(p)?;
3273 }
3274 },
3275 }
3276 Ok(())
3277 }
3278
3279
3280 fn visit_mut_ordering(this, ordering: &mut Ordering){
3281 match ordering{
3282 Ordering::Random => {},
3283 Ordering::Order(order_list) => {
3284 for o in order_list.0.iter_mut(){
3285 this.visit_mut_idiom(&mut o.value)?;
3286 }
3287 },
3288 }
3289 Ok(())
3290 }
3291
3292 fn visit_mut_fields(this, fields: &mut Fields) {
3293 match fields {
3294 Fields::Value(field) => {
3295 this.visit_mut_selector(field)?;
3296 },
3297 Fields::Select(fields) => {
3298 for f in fields.iter_mut(){
3299 this.visit_mut_field(f)?;
3300 }
3301 },
3302 }
3303
3304 Ok(())
3305 }
3306
3307 fn visit_mut_field(this, field: &mut Field){
3308 match field {
3309 Field::All => {},
3310 Field::Single(s) => this.visit_mut_selector(s)?,
3311 }
3312 Ok(())
3313 }
3314
3315 fn visit_mut_selector(this, selector: &mut Selector){
3316 this.visit_mut_expr(&mut selector.expr)?;
3317 if let Some(alias) = &mut selector.alias{
3318 this.visit_mut_idiom(alias)?;
3319 }
3320 Ok(())
3321 }
3322
3323 fn visit_mut_lookup_subject(this, subject: &mut LookupSubject){
3324 match subject{
3325 LookupSubject::Table { .. } => {},
3326 LookupSubject::Range { range, .. } => {
3327 this.visit_mut_record_id_key_range(range)?;
3328 },
3329 }
3330 Ok(())
3331 }
3332}
3333
3334#[cfg(test)]
3335mod tests {
3336 use std::convert::Infallible;
3337
3338 use super::{MutVisitor, VisitMut};
3339 use crate::expr::permission::Permission;
3340 use crate::expr::{Expr, Literal};
3341
3342 fn guard(p: &Permission) -> &Expr {
3343 let Permission::Specific(expr) = p else {
3344 panic!("expected a specific permission");
3345 };
3346 expr
3347 }
3348
3349 #[test]
3356 fn mutating_walk_reaches_the_guard() {
3357 struct Increment;
3358 impl MutVisitor for Increment {
3359 type Error = Infallible;
3360
3361 fn visit_mut_expr(&mut self, e: &mut Expr) -> Result<(), Self::Error> {
3362 if let Expr::Literal(Literal::Integer(i)) = e {
3363 *i += 1;
3364 }
3365 e.visit_mut(self)
3366 }
3367 }
3368
3369 let mut p = Permission::Specific(Expr::Literal(Literal::Integer(1)));
3370 p.visit_mut(&mut Increment).unwrap();
3371 assert_eq!(guard(&p), &Expr::Literal(Literal::Integer(2)));
3372 }
3373
3374 #[test]
3378 fn non_mutating_walk_leaves_the_guard_untouched() {
3379 struct Noop;
3380 impl MutVisitor for Noop {
3381 type Error = Infallible;
3382 }
3383
3384 let original = Expr::Literal(Literal::Integer(1));
3385 let mut p = Permission::Specific(original.clone());
3386 p.visit_mut(&mut Noop).unwrap();
3387 assert_eq!(guard(&p), &original);
3388 }
3389}