1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
use serde::Deserialize;

use crate::{Action, Flag, Predicate, SerializableRegex};

#[derive(Debug, Deserialize, PartialEq)]
pub struct Rule {
    #[serde(default)]
    pub flags: Vec<Flag>,
    #[serde(default)]
    pub patterns: Vec<SerializableRegex>,
    #[serde(default)]
    pub predicate: Option<Predicate>,
    pub action: Action,
}

#[test]
fn can_parse_rule() {
    use std::path::PathBuf;

    const S: &str = r#"{
        "flags": ["ignore case"],
        "patterns": [".*\\.pdf", ".*\\.md", ".*\\.csv", ".*\\.doc", ".*\\.docx"],
        "action": "move archives"
    }"#;

    let rule = serde_json::from_str::<Rule>(S).unwrap();
    println!("{:?}", rule);

    assert_eq!(
        rule,
        Rule {
            flags: vec![Flag::IgnoreCase],
            patterns: vec![".*\\.pdf", ".*\\.md", ".*\\.csv", ".*\\.doc", ".*\\.docx"]
                .into_iter()
                .map(|s| s.parse::<SerializableRegex>().unwrap())
                .collect(),
            predicate: None,
            action: Action::Move {
                to: PathBuf::from("archives")
            },
        }
    );
}