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