Skip to content

Commit 5dea1f4

Browse files
committed
parsing flagfile
1 parent 951137a commit 5dea1f4

File tree

4 files changed

+25
-11
lines changed

4 files changed

+25
-11
lines changed

Cargo.lock

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "bool_expr_parser_nom"
3-
version = "0.3.5"
3+
version = "0.3.6"
44
edition = "2021"
55
authors = ["Nikolajus Krauklis <nikolajus@gmail.com>"]
66

Flagfile.example

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* FF-feature-complex-ticket-234234 {
1+
FF-feature-complex-ticket-234234 {
22
// this is yet another
33
a = b and c=d and (dd not in (1,2,3) or z == "demo car"): true
44

@@ -13,7 +13,7 @@
1313
and demo == false: true
1414

1515
false
16-
}*/
16+
}
1717

1818
// once you dont have rules you can use short notation to return boolean
1919
FF-feature-flat-on-off -> true
@@ -27,16 +27,19 @@ FF-feature-y {
2727
countryCode == NL: true
2828
false
2929
}
30+
3031
// demo
3132
FF-some-other -> true
3233

3334
// feature with inside commments and works like scheduler
3435
FF-testing {
35-
false
36+
// testing
37+
json({"success": true})
3638
}
3739

3840
// simple flat on-off flags still can be written as a functions
3941
FF-feature1 {
42+
/* comment like this */
4043
true
4144
}
4245

src/parse_flagfile.rs

+17-6
Original file line numberDiff line numberDiff line change
@@ -81,15 +81,26 @@ fn parse_rule_static(i: &str) -> IResult<&str, Rule> {
8181
fn parse_rules(i: &str) -> IResult<&str, Rule> {
8282
alt((parse_rule_expr, parse_rule_static))(i)
8383
}
84+
85+
fn parse_rules_or_comments(i: &str) -> IResult<&str, Rule> {
86+
terminated(
87+
preceded(many0(alt((parse_comment, multiline_comment))), parse_rules),
88+
many0(alt((parse_comment, multiline_comment))),
89+
)(i)
90+
}
91+
8492
fn parse_rules_list(i: &str) -> IResult<&str, Vec<Rule>> {
85-
many1(parse_rules)(i)
93+
many1(parse_rules_or_comments)(i)
8694
}
8795

8896
fn parse_function(i: &str) -> IResult<&str, FlagValue> {
89-
let func_content = delimited(ws(tag("{")), take_until("}"), ws(tag("}")));
90-
let (i, (flag_name, func_body)) = pair(ws(parse_flag_name), func_content)(i)?;
91-
let (_, rules) = parse_rules_list(func_body)?;
92-
Ok((i, HashMap::from([(flag_name, rules)])))
97+
let parser = pair(
98+
ws(parse_flag_name),
99+
delimited(ws(tag("{")), parse_rules_list, ws(tag("}"))),
100+
);
101+
map(parser, |(flag_name, rules)| {
102+
HashMap::from([(flag_name, rules)])
103+
})(i)
93104
}
94105

95106
pub fn parse_flagfile(i: &str) -> IResult<&str, Vec<FlagValue>> {
@@ -125,8 +136,8 @@ mod tests {
125136
let data = include_str!("../Flagfile.example");
126137

127138
let (i, v) = parse_flagfile(data).unwrap();
139+
dbg!(i, &v);
128140
assert_eq!(true, v.len() > 0);
129-
// dbg!(i, v);
130141
}
131142
}
132143

0 commit comments

Comments
 (0)