@@ -9,6 +9,15 @@ import (
99
1010// ParseFilter parses the given raw data as an Expression.
1111func ParseFilter (raw []byte ) (Expression , error ) {
12+ return parseFilter (raw , config {})
13+ }
14+
15+ // ParseFilterNumber parses the given raw data as an Expression with json.Number.
16+ func ParseFilterNumber (raw []byte ) (Expression , error ) {
17+ return parseFilter (raw , config {useNumber : true })
18+ }
19+
20+ func parseFilter (raw []byte , c config ) (Expression , error ) {
1221 p , err := ast .New (raw )
1322 if err != nil {
1423 return nil , err
@@ -20,101 +29,101 @@ func ParseFilter(raw []byte) (Expression, error) {
2029 if _ , err := p .Expect (parser .EOD ); err != nil {
2130 return nil , err
2231 }
23- return parseFilterOr (node )
32+ return c . parseFilterOr (node )
2433}
2534
26- func parseFilterAnd (node * ast.Node ) (Expression , error ) {
27- if node .Type != typ .FilterAnd {
28- return nil , invalidTypeError (typ .FilterAnd , node .Type )
35+ func ( p config ) parseFilterOr (node * ast.Node ) (Expression , error ) {
36+ if node .Type != typ .FilterOr {
37+ return nil , invalidTypeError (typ .FilterOr , node .Type )
2938 }
3039
3140 children := node .Children ()
3241 if len (children ) == 0 {
33- return nil , invalidLengthError (typ .FilterAnd , 1 , 0 )
42+ return nil , invalidLengthError (typ .FilterOr , 1 , 0 )
3443 }
3544
3645 if len (children ) == 1 {
37- return parseFilterValue (children [0 ])
46+ return p . parseFilterAnd (children [0 ])
3847 }
3948
40- var and LogicalExpression
49+ var or LogicalExpression
4150 for _ , node := range children {
42- exp , err := parseFilterValue (node )
51+ exp , err := p . parseFilterAnd (node )
4352 if err != nil {
4453 return nil , err
4554 }
4655 switch {
47- case and .Left == nil :
48- and .Left = exp
49- case and .Right == nil :
50- and .Right = exp
51- and .Operator = AND
56+ case or .Left == nil :
57+ or .Left = exp
58+ case or .Right == nil :
59+ or .Right = exp
60+ or .Operator = OR
5261 default :
53- and = LogicalExpression {
62+ or = LogicalExpression {
5463 Left : & LogicalExpression {
55- Left : and .Left ,
56- Right : and .Right ,
57- Operator : AND ,
64+ Left : or .Left ,
65+ Right : or .Right ,
66+ Operator : OR ,
5867 },
5968 Right : exp ,
60- Operator : AND ,
69+ Operator : OR ,
6170 }
6271 }
6372 }
64- return & and , nil
73+ return & or , nil
6574}
6675
67- func parseFilterOr (node * ast.Node ) (Expression , error ) {
68- if node .Type != typ .FilterOr {
69- return nil , invalidTypeError (typ .FilterOr , node .Type )
76+ func ( p config ) parseFilterAnd (node * ast.Node ) (Expression , error ) {
77+ if node .Type != typ .FilterAnd {
78+ return nil , invalidTypeError (typ .FilterAnd , node .Type )
7079 }
7180
7281 children := node .Children ()
7382 if len (children ) == 0 {
74- return nil , invalidLengthError (typ .FilterOr , 1 , 0 )
83+ return nil , invalidLengthError (typ .FilterAnd , 1 , 0 )
7584 }
7685
7786 if len (children ) == 1 {
78- return parseFilterAnd (children [0 ])
87+ return p . parseFilterValue (children [0 ])
7988 }
8089
81- var or LogicalExpression
90+ var and LogicalExpression
8291 for _ , node := range children {
83- exp , err := parseFilterAnd (node )
92+ exp , err := p . parseFilterValue (node )
8493 if err != nil {
8594 return nil , err
8695 }
8796 switch {
88- case or .Left == nil :
89- or .Left = exp
90- case or .Right == nil :
91- or .Right = exp
92- or .Operator = OR
97+ case and .Left == nil :
98+ and .Left = exp
99+ case and .Right == nil :
100+ and .Right = exp
101+ and .Operator = AND
93102 default :
94- or = LogicalExpression {
103+ and = LogicalExpression {
95104 Left : & LogicalExpression {
96- Left : or .Left ,
97- Right : or .Right ,
98- Operator : OR ,
105+ Left : and .Left ,
106+ Right : and .Right ,
107+ Operator : AND ,
99108 },
100109 Right : exp ,
101- Operator : OR ,
110+ Operator : AND ,
102111 }
103112 }
104113 }
105- return & or , nil
114+ return & and , nil
106115}
107116
108- func parseFilterValue (node * ast.Node ) (Expression , error ) {
117+ func ( p config ) parseFilterValue (node * ast.Node ) (Expression , error ) {
109118 switch t := node .Type ; t {
110119 case typ .ValuePath :
111- valuePath , err := parseValuePath (node )
120+ valuePath , err := p . parseValuePath (node )
112121 if err != nil {
113122 return nil , err
114123 }
115124 return & valuePath , nil
116125 case typ .AttrExp :
117- attrExp , err := parseAttrExp (node )
126+ attrExp , err := p . parseAttrExp (node )
118127 if err != nil {
119128 return nil , err
120129 }
@@ -125,15 +134,15 @@ func parseFilterValue(node *ast.Node) (Expression, error) {
125134 return nil , invalidLengthError (typ .FilterNot , 1 , l )
126135 }
127136
128- exp , err := parseFilterOr (children [0 ])
137+ exp , err := p . parseFilterOr (children [0 ])
129138 if err != nil {
130139 return nil , err
131140 }
132141 return & NotExpression {
133142 Expression : exp ,
134143 }, nil
135144 case typ .FilterOr :
136- return parseFilterOr (node )
145+ return p . parseFilterOr (node )
137146 default :
138147 return nil , invalidChildTypeError (typ .FilterAnd , t )
139148 }
0 commit comments