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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
use serde_json::Value; use super::super::schema; use super::super::validators; #[allow(missing_copy_implementations)] pub struct Pattern; impl super::Keyword for Pattern { fn compile(&self, def: &Value, ctx: &schema::WalkContext<'_>) -> super::KeywordResult { let pattern = keyword_key_exists!(def, "pattern"); if pattern.is_string() { let pattern_val = pattern.as_str().unwrap(); match regex::Regex::new(pattern_val) { Ok(re) => Ok(Some(Box::new(validators::Pattern { regex: re }))), Err(err) => Err(schema::SchemaError::Malformed { path: ctx.fragment.join("/"), detail: format!("The value of pattern MUST be a valid RegExp, but {:?}", err), }), } } else { Err(schema::SchemaError::Malformed { path: ctx.fragment.join("/"), detail: "The value of pattern MUST be a string".to_string(), }) } } } #[cfg(test)] use super::super::builder; #[cfg(test)] use super::super::scope; #[cfg(test)] use serde_json::to_value; #[test] fn validate() { let mut scope = scope::Scope::new(); let schema = scope .compile_and_return( builder::schema(|s| { s.pattern(r"abb.*"); }) .into_json(), true, ) .ok() .unwrap(); assert_eq!(schema.validate(&to_value("abb").unwrap()).is_valid(), true); assert_eq!(schema.validate(&to_value("abbd").unwrap()).is_valid(), true); assert_eq!(schema.validate(&to_value("abd").unwrap()).is_valid(), false); } #[test] fn mailformed() { let mut scope = scope::Scope::new(); assert!(scope .compile_and_return( jsonway::object(|schema| { schema.set("pattern", "([]".to_string()); }) .unwrap(), true ) .is_err()); assert!(scope .compile_and_return( jsonway::object(|schema| { schema.set("pattern", 2); }) .unwrap(), true ) .is_err()); }