Allow setting validation attributes via #[schemars(...)]
This commit is contained in:
parent
c013052f59
commit
7914593d89
17 changed files with 607 additions and 99 deletions
|
@ -9,7 +9,9 @@
|
|||
"homepage",
|
||||
"map_contains",
|
||||
"min_max",
|
||||
"min_max2",
|
||||
"non_empty_str",
|
||||
"non_empty_str2",
|
||||
"pair",
|
||||
"regex_str1",
|
||||
"regex_str2",
|
||||
|
@ -25,6 +27,12 @@
|
|||
"maximum": 100.0,
|
||||
"minimum": 0.01
|
||||
},
|
||||
"min_max2": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"maximum": 1000.0,
|
||||
"minimum": 1.0
|
||||
},
|
||||
"regex_str1": {
|
||||
"type": "string",
|
||||
"pattern": "^[Hh]ello\\b"
|
||||
|
@ -62,6 +70,11 @@
|
|||
"maxLength": 100,
|
||||
"minLength": 1
|
||||
},
|
||||
"non_empty_str2": {
|
||||
"type": "string",
|
||||
"maxLength": 1000,
|
||||
"minLength": 1
|
||||
},
|
||||
"pair": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
|
|
104
schemars/tests/expected/validate_schemars_attrs.json
Normal file
104
schemars/tests/expected/validate_schemars_attrs.json
Normal file
|
@ -0,0 +1,104 @@
|
|||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"title": "Struct",
|
||||
"type": "object",
|
||||
"required": [
|
||||
"contains_str1",
|
||||
"contains_str2",
|
||||
"email_address",
|
||||
"homepage",
|
||||
"map_contains",
|
||||
"min_max",
|
||||
"min_max2",
|
||||
"non_empty_str",
|
||||
"non_empty_str2",
|
||||
"pair",
|
||||
"regex_str1",
|
||||
"regex_str2",
|
||||
"regex_str3",
|
||||
"required_option",
|
||||
"tel",
|
||||
"x"
|
||||
],
|
||||
"properties": {
|
||||
"min_max": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"maximum": 100.0,
|
||||
"minimum": 0.01
|
||||
},
|
||||
"min_max2": {
|
||||
"type": "number",
|
||||
"format": "float",
|
||||
"maximum": 1000.0,
|
||||
"minimum": 1.0
|
||||
},
|
||||
"regex_str1": {
|
||||
"type": "string",
|
||||
"pattern": "^[Hh]ello\\b"
|
||||
},
|
||||
"regex_str2": {
|
||||
"type": "string",
|
||||
"pattern": "^[Hh]ello\\b"
|
||||
},
|
||||
"regex_str3": {
|
||||
"type": "string",
|
||||
"pattern": "^\\d+$"
|
||||
},
|
||||
"contains_str1": {
|
||||
"type": "string",
|
||||
"pattern": "substring\\.\\.\\."
|
||||
},
|
||||
"contains_str2": {
|
||||
"type": "string",
|
||||
"pattern": "substring\\.\\.\\."
|
||||
},
|
||||
"email_address": {
|
||||
"type": "string",
|
||||
"format": "email"
|
||||
},
|
||||
"tel": {
|
||||
"type": "string",
|
||||
"format": "phone"
|
||||
},
|
||||
"homepage": {
|
||||
"type": "string",
|
||||
"format": "uri"
|
||||
},
|
||||
"non_empty_str": {
|
||||
"type": "string",
|
||||
"maxLength": 100,
|
||||
"minLength": 1
|
||||
},
|
||||
"non_empty_str2": {
|
||||
"type": "string",
|
||||
"maxLength": 1000,
|
||||
"minLength": 1
|
||||
},
|
||||
"pair": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "integer",
|
||||
"format": "int32"
|
||||
},
|
||||
"maxItems": 2,
|
||||
"minItems": 2
|
||||
},
|
||||
"map_contains": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"map_key"
|
||||
],
|
||||
"additionalProperties": {
|
||||
"type": "null"
|
||||
}
|
||||
},
|
||||
"required_option": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"x": {
|
||||
"type": "integer",
|
||||
"format": "int32"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -22,7 +22,7 @@ error: duplicate serde attribute `deny_unknown_fields`
|
|||
8 | #[schemars(default = 0, foo, deny_unknown_fields, deny_unknown_fields)]
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: unknown schemars container attribute `foo`
|
||||
error: unknown schemars attribute `foo`
|
||||
--> $DIR/invalid_attrs.rs:8:25
|
||||
|
|
||||
8 | #[schemars(default = 0, foo, deny_unknown_fields, deny_unknown_fields)]
|
||||
|
|
9
schemars/tests/ui/invalid_validation_attrs.rs
Normal file
9
schemars/tests/ui/invalid_validation_attrs.rs
Normal file
|
@ -0,0 +1,9 @@
|
|||
use schemars::JsonSchema;
|
||||
|
||||
#[derive(JsonSchema)]
|
||||
pub struct Struct1(#[validate(regex = 0, foo, length(min = 1, equal = 2, bar))] String);
|
||||
|
||||
#[derive(JsonSchema)]
|
||||
pub struct Struct2(#[schemars(regex = 0, foo, length(min = 1, equal = 2, bar))] String);
|
||||
|
||||
fn main() {}
|
29
schemars/tests/ui/invalid_validation_attrs.stderr
Normal file
29
schemars/tests/ui/invalid_validation_attrs.stderr
Normal file
|
@ -0,0 +1,29 @@
|
|||
error: expected validate regex attribute to be a string: `regex = "..."`
|
||||
--> $DIR/invalid_validation_attrs.rs:4:39
|
||||
|
|
||||
4 | pub struct Struct1(#[validate(regex = 0, foo, length(min = 1, equal = 2, bar))] String);
|
||||
| ^
|
||||
|
||||
error: unknown schemars attribute `foo`
|
||||
--> $DIR/invalid_validation_attrs.rs:7:42
|
||||
|
|
||||
7 | pub struct Struct2(#[schemars(regex = 0, foo, length(min = 1, equal = 2, bar))] String);
|
||||
| ^^^
|
||||
|
||||
error: expected schemars regex attribute to be a string: `regex = "..."`
|
||||
--> $DIR/invalid_validation_attrs.rs:7:39
|
||||
|
|
||||
7 | pub struct Struct2(#[schemars(regex = 0, foo, length(min = 1, equal = 2, bar))] String);
|
||||
| ^
|
||||
|
||||
error: schemars attribute cannot contain both `equal` and `min`
|
||||
--> $DIR/invalid_validation_attrs.rs:7:63
|
||||
|
|
||||
7 | pub struct Struct2(#[schemars(regex = 0, foo, length(min = 1, equal = 2, bar))] String);
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: unknown item in schemars length attribute
|
||||
--> $DIR/invalid_validation_attrs.rs:7:74
|
||||
|
|
||||
7 | pub struct Struct2(#[schemars(regex = 0, foo, length(min = 1, equal = 2, bar))] String);
|
||||
| ^^^
|
|
@ -6,10 +6,15 @@ use util::*;
|
|||
// In real code, this would typically be a Regex, potentially created in a `lazy_static!`.
|
||||
static STARTS_WITH_HELLO: &'static str = r"^[Hh]ello\b";
|
||||
|
||||
const MIN: u32 = 1;
|
||||
const MAX: u32 = 1000;
|
||||
|
||||
#[derive(Debug, JsonSchema)]
|
||||
pub struct Struct {
|
||||
#[validate(range(min = 0.01, max = 100))]
|
||||
min_max: f32,
|
||||
#[validate(range(min = "MIN", max = "MAX"))]
|
||||
min_max2: f32,
|
||||
#[validate(regex = "STARTS_WITH_HELLO")]
|
||||
regex_str1: String,
|
||||
#[validate(regex(path = "STARTS_WITH_HELLO", code = "foo"))]
|
||||
|
@ -28,6 +33,8 @@ pub struct Struct {
|
|||
homepage: String,
|
||||
#[validate(length(min = 1, max = 100))]
|
||||
non_empty_str: String,
|
||||
#[validate(length(min = "MIN", max = "MAX"))]
|
||||
non_empty_str2: String,
|
||||
#[validate(length(equal = 2))]
|
||||
pair: Vec<i32>,
|
||||
#[validate(contains = "map_key")]
|
||||
|
@ -49,6 +56,48 @@ fn validate() -> TestResult {
|
|||
test_default_generated_schema::<Struct>("validate")
|
||||
}
|
||||
|
||||
#[derive(Debug, JsonSchema)]
|
||||
pub struct Struct2 {
|
||||
#[schemars(range(min = 0.01, max = 100))]
|
||||
min_max: f32,
|
||||
#[schemars(range(min = "MIN", max = "MAX"))]
|
||||
min_max2: f32,
|
||||
#[schemars(regex = "STARTS_WITH_HELLO")]
|
||||
regex_str1: String,
|
||||
#[schemars(regex(path = "STARTS_WITH_HELLO"))]
|
||||
regex_str2: String,
|
||||
#[schemars(regex(pattern = r"^\d+$"))]
|
||||
regex_str3: String,
|
||||
#[schemars(contains = "substring...")]
|
||||
contains_str1: String,
|
||||
#[schemars(contains(pattern = "substring..."))]
|
||||
contains_str2: String,
|
||||
#[schemars(email)]
|
||||
email_address: String,
|
||||
#[schemars(phone)]
|
||||
tel: String,
|
||||
#[schemars(url)]
|
||||
homepage: String,
|
||||
#[schemars(length(min = 1, max = 100))]
|
||||
non_empty_str: String,
|
||||
#[schemars(length(min = "MIN", max = "MAX"))]
|
||||
non_empty_str2: String,
|
||||
#[schemars(length(equal = 2))]
|
||||
pair: Vec<i32>,
|
||||
#[schemars(contains = "map_key")]
|
||||
map_contains: HashMap<String, ()>,
|
||||
#[schemars(required)]
|
||||
required_option: Option<bool>,
|
||||
#[schemars(required)]
|
||||
#[serde(flatten)]
|
||||
required_flattened: Option<Inner>,
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn validate_schemars_attrs() -> TestResult {
|
||||
test_default_generated_schema::<Struct>("validate_schemars_attrs")
|
||||
}
|
||||
|
||||
#[derive(Debug, JsonSchema)]
|
||||
pub struct Tuple(
|
||||
#[validate(range(max = 10))] u8,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue