diff --git a/src/parser.rs b/src/parser.rs index c0518ac..223f16b 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -86,17 +86,34 @@ fn parse_rule( rule.title = title.to_string(); } } - Rule::rule_directive_tags => rule.tags = parse_tags(item.into_inner().next().unwrap()), + Rule::rule_directive_tags => { + if !rule.tags.is_empty() { + panic!("tags specified multiple times"); + } + rule.tags = parse_tags(item.into_inner().next().unwrap()) + } Rule::rule_directive_files => { + if rule.files.is_some() { + panic!("files condition specified multiple times"); + } rule.files = Some(parse_globs_condition(item.into_inner().next().unwrap())); } Rule::rule_directive_nofiles => { + if rule.nofiles.is_some() { + panic!("nofiles condition specified multiple times"); + } rule.nofiles = Some(parse_globs_condition(item.into_inner().next().unwrap())); } Rule::rule_directive_match => { + if rule.match_.is_some() { + panic!("match condition specified multiple times"); + } rule.match_ = Some(parse_regexes_condition(item.into_inner().next().unwrap())); } Rule::rule_directive_nomatch => { + if rule.nomatch.is_some() { + panic!("nomatch condition specified multiple times"); + } rule.nomatch = Some(parse_regexes_condition(item.into_inner().next().unwrap())); } _ => unreachable!("unexpected parser rule type in parse_rule {:#?}", item), diff --git a/tests/misc.rs b/tests/misc.rs index 5fb12af..9503410 100644 --- a/tests/misc.rs +++ b/tests/misc.rs @@ -69,3 +69,15 @@ mod stdout { .assert_stdout_contains("a.py:2"); } } + +mod parsing { + use super::*; + + #[test] + fn multiple_conditions() { + TestCase::new_for_stdout_tests() + .add_rule("files *.py\nfiles *.py") + .run() + .assert_failure(); + } +}