1use crate::{
2 directive::{directive, Directive},
3 error::NomResult,
4 per_file::{per_file, PerFile},
5};
6use nom::{branch::alt, combinator::map, error::context};
7
8#[derive(Debug, PartialEq)]
9pub enum Statement {
10 Directive(Directive),
11 PerFile(PerFile),
12}
13
14pub(crate) fn statement(input: &str) -> NomResult<Statement> {
15 context(
16 "statement",
17 alt((map(per_file, Statement::PerFile), map(directive, Statement::Directive))),
18 )(input)
19}
20
21#[cfg(test)]
22mod tests {
23 use super::*;
24 use globset::Glob;
25
26 #[test]
27 fn directive() {
28 let (rem, parsed) = statement("*").unwrap();
29
30 assert_eq!(parsed, Statement::Directive(Directive::StarGlob));
31 assert!(rem.is_empty());
32 }
33
34 #[test]
35 fn per_file() {
36 let (rem, parsed) = statement("per-file *.rs = *").unwrap();
37
38 assert_eq!(
39 parsed,
40 Statement::PerFile(PerFile {
41 glob: Glob::new("*.rs").unwrap(),
42 directive: Directive::StarGlob
43 })
44 );
45 assert!(rem.is_empty());
46 }
47}