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")
},
}
);
}