@@ -5,7 +5,7 @@ use std::str::FromStr as _;
5
5
use super :: functions;
6
6
use super :: QueryError ;
7
7
use aw_models:: Event ;
8
- use aw_transform:: classify:: { KeyValueRule , LogicalOperator , LogicalRule , RegexRule , Rule } ;
8
+ use aw_transform:: classify:: { LogicalOperator , LogicalRule , RegexRule , Rule } ;
9
9
10
10
use serde:: { Serialize , Serializer } ;
11
11
use serde_json:: value:: Value ;
@@ -301,61 +301,42 @@ impl TryFrom<&DataType> for Rule {
301
301
302
302
match rtype. as_str ( ) {
303
303
"none" => Ok ( Self :: None ) ,
304
- "or" | "and" => {
305
- let Some ( rules) = obj. get ( "rules" ) else {
306
- return Err ( QueryError :: InvalidFunctionParameters ( format ! (
307
- "{} rule is missing the 'rules' field" ,
308
- rtype
309
- ) ) ) ;
310
- } ;
311
-
312
- let rules = match rules {
313
- DataType :: List ( rules) => rules
314
- . iter ( )
315
- . map ( Rule :: try_from)
316
- . collect :: < Result < Vec < _ > , _ > > ( ) ?,
317
- _ => {
318
- return Err ( QueryError :: InvalidFunctionParameters ( format ! (
319
- "the rules field of the {} rule is not a list" ,
320
- rtype
321
- ) ) )
322
- }
323
- } ;
324
-
325
- let operator = LogicalOperator :: from_str ( rtype)
326
- . map_err ( QueryError :: InvalidFunctionParameters ) ?;
327
-
328
- Ok ( Rule :: Logical ( LogicalRule :: new ( rules, operator) ) )
329
- }
304
+ "or" | "and" => parse_logical_rule ( obj, rtype) ,
330
305
"regex" => parse_regex_rule ( obj) ,
331
- "keyvalue" => {
332
- let Some ( rules) = obj. get ( "rules" ) else {
333
- return Err ( QueryError :: InvalidFunctionParameters (
334
- "keyval rule is missing the 'rules' field" . to_string ( ) ,
335
- ) ) ;
336
- } ;
337
-
338
- let rules = match rules {
339
- DataType :: Dict ( rules) => rules
340
- . iter ( )
341
- . map ( |( k, v) | Rule :: try_from ( v) . map ( |v| ( k. to_owned ( ) , v) ) )
342
- . collect :: < Result < HashMap < _ , _ > , _ > > ( ) ?,
343
- _ => {
344
- return Err ( QueryError :: InvalidFunctionParameters (
345
- "the rules field of the keyval rule is not a dict" . to_string ( ) ,
346
- ) )
347
- }
348
- } ;
349
-
350
- Ok ( Rule :: KeyValue ( KeyValueRule :: new ( rules) ) )
351
- }
352
306
_ => Err ( QueryError :: InvalidFunctionParameters ( format ! (
353
307
"Unknown rule type '{rtype}'"
354
308
) ) ) ,
355
309
}
356
310
}
357
311
}
358
312
313
+ fn parse_logical_rule ( obj : & HashMap < String , DataType > , rtype : & String ) -> Result < Rule , QueryError > {
314
+ let Some ( rules) = obj. get ( "rules" ) else {
315
+ return Err ( QueryError :: InvalidFunctionParameters ( format ! (
316
+ "{} rule is missing the 'rules' field" ,
317
+ rtype
318
+ ) ) ) ;
319
+ } ;
320
+
321
+ let rules = match rules {
322
+ DataType :: List ( rules) => rules
323
+ . iter ( )
324
+ . map ( Rule :: try_from)
325
+ . collect :: < Result < Vec < _ > , _ > > ( ) ?,
326
+ _ => {
327
+ return Err ( QueryError :: InvalidFunctionParameters ( format ! (
328
+ "the rules field of the {} rule is not a list" ,
329
+ rtype
330
+ ) ) )
331
+ }
332
+ } ;
333
+
334
+ let operator =
335
+ LogicalOperator :: from_str ( rtype) . map_err ( QueryError :: InvalidFunctionParameters ) ?;
336
+
337
+ Ok ( Rule :: Logical ( LogicalRule :: new ( rules, operator) ) )
338
+ }
339
+
359
340
fn parse_regex_rule ( obj : & HashMap < String , DataType > ) -> Result < Rule , QueryError > {
360
341
let regex_val = match obj. get ( "regex" ) {
361
342
Some ( regex_val) => regex_val,
@@ -385,7 +366,16 @@ fn parse_regex_rule(obj: &HashMap<String, DataType>) -> Result<Rule, QueryError>
385
366
) )
386
367
}
387
368
} ;
388
- let regex_rule = match RegexRule :: new ( regex_str, * ignore_case) {
369
+ let match_field = match obj. get ( "field" ) {
370
+ Some ( DataType :: String ( v) ) => Some ( v. to_owned ( ) ) ,
371
+ None => None ,
372
+ _ => {
373
+ return Err ( QueryError :: InvalidFunctionParameters (
374
+ "the `field` field of the regex rule is not a string" . to_string ( ) ,
375
+ ) )
376
+ }
377
+ } ;
378
+ let regex_rule = match RegexRule :: new ( regex_str, * ignore_case, match_field) {
389
379
Ok ( regex_rule) => regex_rule,
390
380
Err ( err) => {
391
381
return Err ( QueryError :: RegexCompileError ( format ! (
0 commit comments