diff --git a/Cargo.lock b/Cargo.lock index 99000ea..bd06bb2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -25,7 +25,7 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "bool_expr_parser_nom" -version = "0.3.5" +version = "0.3.6" dependencies = [ "chrono", "js-sys", diff --git a/Cargo.toml b/Cargo.toml index 84e5d22..ffb8952 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "bool_expr_parser_nom" -version = "0.3.5" +version = "0.3.6" edition = "2021" authors = ["Nikolajus Krauklis "] diff --git a/Flagfile.example b/Flagfile.example index e7b3cac..ba8ee72 100644 --- a/Flagfile.example +++ b/Flagfile.example @@ -1,4 +1,4 @@ -/* FF-feature-complex-ticket-234234 { +FF-feature-complex-ticket-234234 { // this is yet another a = b and c=d and (dd not in (1,2,3) or z == "demo car"): true @@ -13,7 +13,7 @@ and demo == false: true false -}*/ +} // once you dont have rules you can use short notation to return boolean FF-feature-flat-on-off -> true @@ -27,16 +27,19 @@ FF-feature-y { countryCode == NL: true false } + // demo FF-some-other -> true // feature with inside commments and works like scheduler FF-testing { - false + // testing + json({"success": true}) } // simple flat on-off flags still can be written as a functions FF-feature1 { + /* comment like this */ true } diff --git a/src/parse_flagfile.rs b/src/parse_flagfile.rs index 88191d5..c93c458 100644 --- a/src/parse_flagfile.rs +++ b/src/parse_flagfile.rs @@ -81,15 +81,26 @@ fn parse_rule_static(i: &str) -> IResult<&str, Rule> { fn parse_rules(i: &str) -> IResult<&str, Rule> { alt((parse_rule_expr, parse_rule_static))(i) } + +fn parse_rules_or_comments(i: &str) -> IResult<&str, Rule> { + terminated( + preceded(many0(alt((parse_comment, multiline_comment))), parse_rules), + many0(alt((parse_comment, multiline_comment))), + )(i) +} + fn parse_rules_list(i: &str) -> IResult<&str, Vec> { - many1(parse_rules)(i) + many1(parse_rules_or_comments)(i) } fn parse_function(i: &str) -> IResult<&str, FlagValue> { - let func_content = delimited(ws(tag("{")), take_until("}"), ws(tag("}"))); - let (i, (flag_name, func_body)) = pair(ws(parse_flag_name), func_content)(i)?; - let (_, rules) = parse_rules_list(func_body)?; - Ok((i, HashMap::from([(flag_name, rules)]))) + let parser = pair( + ws(parse_flag_name), + delimited(ws(tag("{")), parse_rules_list, ws(tag("}"))), + ); + map(parser, |(flag_name, rules)| { + HashMap::from([(flag_name, rules)]) + })(i) } pub fn parse_flagfile(i: &str) -> IResult<&str, Vec> { @@ -125,8 +136,8 @@ mod tests { let data = include_str!("../Flagfile.example"); let (i, v) = parse_flagfile(data).unwrap(); + dbg!(i, &v); assert_eq!(true, v.len() > 0); - // dbg!(i, v); } }