@@ -10,11 +10,38 @@ use crate::val::Symbol;
1010use std:: collections:: HashSet ;
1111use std:: fmt:: { Display , Formatter , Result } ;
1212
13+ /// A visitable that accepts a visitor.
14+ pub trait Visitable {
15+ fn accept_visitor ( & self , visitor : & mut impl Visitor ) ;
16+ }
17+
18+ /// A visitor trait used for working with a generated filter AST.
19+ pub trait Visitor {
20+ fn visit_cond_or ( & mut self , node : & Or ) ;
21+
22+ fn visit_cond_and ( & mut self , node : & And ) ;
23+
24+ fn visit_parens ( & mut self , node : & Parens ) ;
25+
26+ fn visit_has ( & mut self , node : & Has ) ;
27+
28+ fn visit_missing ( & mut self , node : & Missing ) ;
29+
30+ fn visit_is_a ( & mut self , node : & IsA ) ;
31+
32+ fn visit_wildcard_equals ( & mut self , node : & WildcardEq ) ;
33+
34+ fn visit_relation ( & mut self , node : & Relation ) ;
35+
36+ fn visit_cmp ( & mut self , node : & Cmp ) ;
37+ }
38+
1339/// A Haystack Filter Or expression
1440#[ derive( PartialEq , PartialOrd , Clone , Debug ) ]
1541pub struct Or {
1642 pub ands : Vec < And > ,
1743}
44+
1845impl Display for Or {
1946 fn fmt ( & self , f : & mut Formatter < ' _ > ) -> Result {
2047 self . ands
@@ -37,6 +64,12 @@ impl Eval for Or {
3764 }
3865}
3966
67+ impl Visitable for Or {
68+ fn accept_visitor ( & self , visitor : & mut impl Visitor ) {
69+ visitor. visit_cond_or ( self ) ;
70+ }
71+ }
72+
4073/// A Haystack Filter And expression
4174#[ derive( PartialEq , PartialOrd , Clone , Debug ) ]
4275pub struct And {
@@ -65,6 +98,12 @@ impl Display for And {
6598 }
6699}
67100
101+ impl Visitable for And {
102+ fn accept_visitor ( & self , visitor : & mut impl Visitor ) {
103+ visitor. visit_cond_and ( self ) ;
104+ }
105+ }
106+
68107/// A Haystack Filter terminal
69108#[ derive( PartialEq , PartialOrd , Clone , Debug ) ]
70109pub enum Term {
@@ -105,6 +144,20 @@ impl Display for Term {
105144 }
106145}
107146
147+ impl Visitable for Term {
148+ fn accept_visitor ( & self , visitor : & mut impl Visitor ) {
149+ match self {
150+ Term :: Parens ( parens) => parens. accept_visitor ( visitor) ,
151+ Term :: Has ( has) => has. accept_visitor ( visitor) ,
152+ Term :: Missing ( missing) => missing. accept_visitor ( visitor) ,
153+ Term :: IsA ( isa) => isa. accept_visitor ( visitor) ,
154+ Term :: WildcardEq ( wildcard_eq) => wildcard_eq. accept_visitor ( visitor) ,
155+ Term :: Relation ( rel) => rel. accept_visitor ( visitor) ,
156+ Term :: Cmp ( cmp) => cmp. accept_visitor ( visitor) ,
157+ }
158+ }
159+ }
160+
108161/// Filter compare operators
109162#[ derive( PartialEq , Eq , PartialOrd , Clone , Debug ) ]
110163pub enum CmpOp {
@@ -170,6 +223,12 @@ impl Display for Cmp {
170223 }
171224}
172225
226+ impl Visitable for Cmp {
227+ fn accept_visitor ( & self , visitor : & mut impl Visitor ) {
228+ visitor. visit_cmp ( self ) ;
229+ }
230+ }
231+
173232/// Missing term
174233#[ derive( PartialEq , Eq , PartialOrd , Clone , Debug ) ]
175234pub struct Missing {
@@ -188,6 +247,12 @@ impl Display for Missing {
188247 }
189248}
190249
250+ impl Visitable for Missing {
251+ fn accept_visitor ( & self , visitor : & mut impl Visitor ) {
252+ visitor. visit_missing ( self ) ;
253+ }
254+ }
255+
191256/// Parenthesis term
192257#[ derive( PartialEq , PartialOrd , Clone , Debug ) ]
193258pub struct Parens {
@@ -207,6 +272,12 @@ impl Display for Parens {
207272 }
208273}
209274
275+ impl Visitable for Parens {
276+ fn accept_visitor ( & self , visitor : & mut impl Visitor ) {
277+ visitor. visit_parens ( self ) ;
278+ }
279+ }
280+
210281/// Has term
211282#[ derive( PartialEq , Eq , PartialOrd , Clone , Debug ) ]
212283pub struct Has {
@@ -224,6 +295,12 @@ impl Display for Has {
224295 }
225296}
226297
298+ impl Visitable for Has {
299+ fn accept_visitor ( & self , visitor : & mut impl Visitor ) {
300+ visitor. visit_has ( self ) ;
301+ }
302+ }
303+
227304/// Is A term
228305#[ derive( PartialEq , Eq , PartialOrd , Clone , Debug ) ]
229306pub struct IsA {
@@ -242,6 +319,12 @@ impl Display for IsA {
242319 }
243320}
244321
322+ impl Visitable for IsA {
323+ fn accept_visitor ( & self , visitor : & mut impl Visitor ) {
324+ visitor. visit_is_a ( self ) ;
325+ }
326+ }
327+
245328/// Wildcard equality
246329#[ derive( PartialEq , Eq , PartialOrd , Clone , Debug ) ]
247330pub struct WildcardEq {
@@ -290,6 +373,12 @@ impl Display for WildcardEq {
290373 }
291374}
292375
376+ impl Visitable for WildcardEq {
377+ fn accept_visitor ( & self , visitor : & mut impl Visitor ) {
378+ visitor. visit_wildcard_equals ( self ) ;
379+ }
380+ }
381+
293382/// Relation
294383#[ derive( PartialEq , Eq , PartialOrd , Clone , Debug ) ]
295384pub struct Relation {
@@ -326,3 +415,9 @@ impl Display for Relation {
326415 }
327416 }
328417}
418+
419+ impl Visitable for Relation {
420+ fn accept_visitor ( & self , visitor : & mut impl Visitor ) {
421+ visitor. visit_relation ( self ) ;
422+ }
423+ }
0 commit comments