@@ -5,7 +5,7 @@ use std::str::FromStr as _;
55use super :: functions;
66use super :: QueryError ;
77use aw_models:: Event ;
8- use aw_transform:: classify:: { KeyValueRule , LogicalOperator , LogicalRule , RegexRule , Rule } ;
8+ use aw_transform:: classify:: { LogicalOperator , LogicalRule , RegexRule , Rule } ;
99
1010use serde:: { Serialize , Serializer } ;
1111use serde_json:: value:: Value ;
@@ -301,61 +301,42 @@ impl TryFrom<&DataType> for Rule {
301301
302302 match rtype. as_str ( ) {
303303 "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) ,
330305 "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- }
352306 _ => Err ( QueryError :: InvalidFunctionParameters ( format ! (
353307 "Unknown rule type '{rtype}'"
354308 ) ) ) ,
355309 }
356310 }
357311}
358312
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+
359340fn parse_regex_rule ( obj : & HashMap < String , DataType > ) -> Result < Rule , QueryError > {
360341 let regex_val = match obj. get ( "regex" ) {
361342 Some ( regex_val) => regex_val,
@@ -385,7 +366,16 @@ fn parse_regex_rule(obj: &HashMap<String, DataType>) -> Result<Rule, QueryError>
385366 ) )
386367 }
387368 } ;
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) {
389379 Ok ( regex_rule) => regex_rule,
390380 Err ( err) => {
391381 return Err ( QueryError :: RegexCompileError ( format ! (
0 commit comments