1- use std:: error:: Error ;
2-
31use nom:: {
42 branch:: alt,
5- bytes:: complete:: { tag, tag_no_case, take_until, take_while , take_while1} ,
3+ bytes:: complete:: { tag, tag_no_case, take_until, take_while1} ,
64 character:: {
75 complete:: { char, space0} ,
86 streaming:: space1,
97 } ,
10- combinator:: { fail, into, success, value} ,
11- error:: context,
8+ combinator:: { fail, value} ,
129 multi:: { many0, many1} ,
13- sequence:: { delimited, preceded , terminated, tuple} ,
14- IResult , Parser ,
10+ sequence:: { delimited, terminated, tuple} ,
11+ IResult ,
1512} ;
1613
17- // ============================================================
18- // Query
19- // ============================================================
20-
21- #[ derive( PartialEq , Eq , Clone , Debug ) ]
22- pub enum CompareOperator {
23- Less ,
24- LessEqual ,
25- Equal ,
26- NotEqual ,
27- Greater ,
28- GreaterEqual ,
29- }
14+ use super :: query:: CompareOperator ;
3015
3116#[ derive( Clone , Debug ) ]
32- pub enum Query {
33- Keyword ( String ) ,
34- Filter {
35- key : String ,
36- op : CompareOperator ,
37- value : String ,
38- } ,
39- Property {
40- key : String ,
41- op : CompareOperator ,
42- value : String ,
43- } ,
44- And ( Vec < Query > ) ,
45- Or ( Vec < Query > ) ,
46- Not ( Box < Query > ) ,
47- }
48-
49- #[ derive( Debug ) ]
50- pub struct InvalidSearchError ;
51-
52- impl < T : Error > From < T > for InvalidSearchError {
53- fn from ( _: T ) -> Self {
54- Self
55- }
56- }
57-
58- pub fn parse ( input : & str ) -> Result < Query , InvalidSearchError > {
59- let ( remaining, expr) = parse_expr ( input) ?;
60-
61- if !remaining. is_empty ( ) {
62- Err ( InvalidSearchError )
63- } else {
64- Ok ( expr. try_into ( ) ?)
65- }
66- }
67-
68- enum ParseState {
69- Normal ,
70- Not ,
71- And ,
72- Or ,
73- }
74-
75- impl TryFrom < Expr > for Query {
76- type Error = InvalidSearchError ;
77-
78- fn try_from ( value : Expr ) -> Result < Self , InvalidSearchError > {
79- expr_to_query ( value)
80- }
81- }
82-
83- fn expr_to_query ( expr : Expr ) -> Result < Query , InvalidSearchError > {
84- println ! ( "Expr: {:?}" , expr) ;
85-
86- match expr {
87- Expr :: Sequence ( mut seq) if seq. len ( ) == 1 => Ok ( expr_to_query ( seq. pop ( ) . unwrap ( ) ) ?) ,
88- Expr :: Sequence ( mut seq) => {
89- let has_or = seq. iter ( ) . find ( |expr| matches ! ( expr, Expr :: Or ) ) . is_some ( ) ;
90-
91- if has_or {
92- let mut root: Vec < Query > = Vec :: new ( ) ;
93- let mut current: Vec < Query > = Vec :: new ( ) ;
94-
95- // let not_state =
96-
97- for expr in seq. into_iter ( ) { }
98-
99- Ok ( Query :: Or ( vec ! [ ] ) )
100- } else {
101- let mut root: Vec < Query > = Vec :: new ( ) ;
102- let mut not_state = false ;
103-
104- for expr in seq. into_iter ( ) {
105- if not_state {
106- root. push ( Query :: Not ( Box :: new ( expr_to_query ( expr) ?) ) ) ;
107- not_state = false ;
108- } else if matches ! ( expr, Expr :: Not ) {
109- not_state = true ;
110- } else if matches ! ( expr, Expr :: And ) {
111- // Do nothing.
112- } else {
113- root. push ( expr_to_query ( expr) ?) ;
114- }
115- }
116-
117- Ok ( vec_to_and_query ( root) )
118- }
119- }
120- Expr :: String ( string) => Ok ( Query :: Keyword ( string) ) ,
121- Expr :: Filter { key, op, value } => Ok ( Query :: Filter { key, op, value } ) ,
122- Expr :: Property { key, op, value } => Ok ( Query :: Property { key, op, value } ) ,
123- x => {
124- println ! ( "Not recognized: {:?}" , x) ;
125- Err ( InvalidSearchError )
126- } // _ => Err(InvalidSearchError),
127- }
128- }
129-
130- fn vec_to_and_query ( vec : Vec < Query > ) -> Query {
131- if vec. len ( ) == 1 {
132- vec. into_iter ( ) . next ( ) . unwrap ( )
133- } else {
134- Query :: And ( vec)
135- }
136- }
137-
138- #[ cfg( test) ]
139- mod tests {
140- use super :: * ;
141-
142- #[ test]
143- fn asdf ( ) {
144- let input = "aaa && (bb && !cc)" ;
145-
146- println ! ( "Result: {:?}" , parse( input) ) ;
147-
148- panic ! ( ) ;
149- }
150- }
151-
152- // ============================================================
153- // Expr
154- // ============================================================
155-
156- #[ derive( Clone , Debug ) ]
157- enum Expr {
17+ pub enum Expr {
15818 String ( String ) ,
15919 Not ,
16020 And ,
@@ -172,7 +32,7 @@ enum Expr {
17232 Sequence ( Vec < Expr > ) ,
17333}
17434
175- fn parse_expr ( input : & str ) -> IResult < & str , Expr > {
35+ pub fn parse_expr ( input : & str ) -> IResult < & str , Expr > {
17636 let ( remaining, output) = many0 ( alt ( ( parse_paren, parse_seq) ) ) ( input) ?;
17737
17838 Ok ( ( remaining, Expr :: Sequence ( output) ) )
@@ -204,28 +64,24 @@ fn parse_single(input: &str) -> IResult<&str, Expr> {
20464}
20565
20666fn parse_not_expr ( input : & str ) -> IResult < & str , Expr > {
207- let ( remaining, _) = alt ( (
208- terminated ( tag ( "!" ) , space0) ,
209- terminated ( tag_no_case ( "NOT" ) , space1) ,
210- ) ) ( input) ?;
67+ let ( remaining, _) =
68+ alt ( ( terminated ( tag ( "!" ) , space0) , terminated ( tag ( "not" ) , space1) ) ) ( input) ?;
21169
21270 Ok ( ( remaining, Expr :: Not ) )
21371}
21472
21573fn parse_and_expr ( input : & str ) -> IResult < & str , Expr > {
21674 let ( remaining, _) = alt ( (
21775 terminated ( tag ( "&&" ) , space0) ,
218- terminated ( tag_no_case ( "AND ") , space1) ,
76+ terminated ( tag ( "and ") , space1) ,
21977 ) ) ( input) ?;
22078
22179 Ok ( ( remaining, Expr :: And ) )
22280}
22381
22482fn parse_or_expr ( input : & str ) -> IResult < & str , Expr > {
225- let ( remaining, _) = alt ( (
226- terminated ( tag ( "||" ) , space0) ,
227- terminated ( tag_no_case ( "OR" ) , space1) ,
228- ) ) ( input) ?;
83+ let ( remaining, _) =
84+ alt ( ( terminated ( tag ( "||" ) , space0) , terminated ( tag ( "or" ) , space1) ) ) ( input) ?;
22985
23086 Ok ( ( remaining, Expr :: Or ) )
23187}
0 commit comments