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
use serde_json::{Value}; use super::super::errors; pub struct MutuallyExclusive { params: Vec<String> } impl MutuallyExclusive { pub fn new(params: &[&str]) -> MutuallyExclusive { MutuallyExclusive { params: params.iter().map(|s| s.to_string()).collect() } } } impl super::Validator for MutuallyExclusive { fn validate(&self, val: &Value, path: &str) -> super::ValidatorResult { let object = strict_process!(val.as_object(), path, "The value must be an object"); let mut matched = vec![]; for param in self.params.iter() { if object.contains_key(param) { matched.push(param.clone()); } } if matched.len() <= 1 { Ok(()) } else { Err(vec![ Box::new(errors::MutuallyExclusive{ path: path.to_string(), params: matched, detail: Some("Fields are mutually exclusive".to_string()) }) ]) } } }