valico/json_schema/keywords/
pattern.rs
1use serde_json::{Value};
2use regex;
3
4use super::super::schema;
5use super::super::validators;
6
7#[allow(missing_copy_implementations)]
8pub struct Pattern;
9impl super::Keyword for Pattern {
10 fn compile(&self, def: &Value, ctx: &schema::WalkContext) -> super::KeywordResult {
11 let pattern = keyword_key_exists!(def, "pattern");
12
13 if pattern.is_string() {
14 let pattern_val = pattern.as_str().unwrap();
15 match regex::Regex::new(pattern_val) {
16 Ok(re) => Ok(Some(Box::new(validators::Pattern {
17 regex: re
18 }))),
19 Err(err) => Err(schema::SchemaError::Malformed {
20 path: ctx.fragment.join("/"),
21 detail: format!("The value of pattern MUST be a valid RegExp, but {:?}", err)
22 }),
23 }
24 } else {
25 Err(schema::SchemaError::Malformed {
26 path: ctx.fragment.join("/"),
27 detail: "The value of pattern MUST be a string".to_string()
28 })
29 }
30 }
31}
32
33#[cfg(test)] use super::super::scope;
34#[cfg(test)] use jsonway;
35#[cfg(test)] use super::super::builder;
36#[cfg(test)] use serde_json::to_value;
37
38#[test]
39fn validate() {
40 let mut scope = scope::Scope::new();
41 let schema = scope.compile_and_return(builder::schema(|s| {
42 s.pattern(r"abb.*");
43 }).into_json(), true).ok().unwrap();
44
45 assert_eq!(schema.validate(&to_value("abb").unwrap()).is_valid(), true);
46 assert_eq!(schema.validate(&to_value("abbd").unwrap()).is_valid(), true);
47 assert_eq!(schema.validate(&to_value("abd").unwrap()).is_valid(), false);
48}
49
50#[test]
51fn mailformed() {
52 let mut scope = scope::Scope::new();
53
54 assert!(scope.compile_and_return(jsonway::object(|schema| {
55 schema.set("pattern", "([]".to_string());
56 }).unwrap(), true).is_err());
57
58 assert!(scope.compile_and_return(jsonway::object(|schema| {
59 schema.set("pattern", 2);
60 }).unwrap(), true).is_err());
61}