Skip to main content

ownrs/
statement.rs

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}