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}