Make HashSet and BTreeSet use the uniqueItems keyword in their schema (#64)
Co-authored-by: Graham Esau <gesau@hotmail.co.uk>
This commit is contained in:
parent
c4ef7bad22
commit
addac6d386
7 changed files with 48 additions and 10 deletions
|
@ -7,6 +7,7 @@
|
||||||
### Changed:
|
### Changed:
|
||||||
- Minimum supported rust version is now 1.37.0
|
- Minimum supported rust version is now 1.37.0
|
||||||
- Deriving JsonSchema on enums now sets `additionalProperties` to false on generated schemas wherever serde doesn't accept unknown properties. This includes non-unit variants of externally tagged enums, and struct-style variants of all enums that have the `deny_unknown_fields` attribute.
|
- Deriving JsonSchema on enums now sets `additionalProperties` to false on generated schemas wherever serde doesn't accept unknown properties. This includes non-unit variants of externally tagged enums, and struct-style variants of all enums that have the `deny_unknown_fields` attribute.
|
||||||
|
- Schemas for HashSet and BTreeSet now have `uniqueItems` set to true (https://github.com/GREsau/schemars/pull/64)
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
- Fix use of `#[serde(transparent)]` in combination with `#[schemars(with = ...)]` (https://github.com/GREsau/schemars/pull/67)
|
- Fix use of `#[serde(transparent)]` in combination with `#[schemars(with = ...)]` (https://github.com/GREsau/schemars/pull/67)
|
||||||
|
|
|
@ -29,9 +29,38 @@ macro_rules! seq_impl {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
macro_rules! set_impl {
|
||||||
|
($($desc:tt)+) => {
|
||||||
|
impl $($desc)+
|
||||||
|
where
|
||||||
|
T: JsonSchema,
|
||||||
|
{
|
||||||
|
no_ref_schema!();
|
||||||
|
|
||||||
|
fn schema_name() -> String {
|
||||||
|
format!("Set_of_{}", T::schema_name())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn json_schema(gen: &mut SchemaGenerator) -> Schema {
|
||||||
|
SchemaObject {
|
||||||
|
instance_type: Some(InstanceType::Array.into()),
|
||||||
|
array: Some(Box::new(ArrayValidation {
|
||||||
|
unique_items: Some(true),
|
||||||
|
items: Some(gen.subschema_for::<T>().into()),
|
||||||
|
..Default::default()
|
||||||
|
})),
|
||||||
|
..Default::default()
|
||||||
|
}
|
||||||
|
.into()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
seq_impl!(<T> JsonSchema for std::collections::BinaryHeap<T>);
|
seq_impl!(<T> JsonSchema for std::collections::BinaryHeap<T>);
|
||||||
seq_impl!(<T> JsonSchema for std::collections::BTreeSet<T>);
|
set_impl!(<T> JsonSchema for std::collections::BTreeSet<T>);
|
||||||
seq_impl!(<T, H> JsonSchema for std::collections::HashSet<T, H>);
|
set_impl!(<T, H> JsonSchema for std::collections::HashSet<T, H>);
|
||||||
seq_impl!(<T> JsonSchema for std::collections::LinkedList<T>);
|
seq_impl!(<T> JsonSchema for std::collections::LinkedList<T>);
|
||||||
seq_impl!(<T> JsonSchema for Vec<T>);
|
seq_impl!(<T> JsonSchema for Vec<T>);
|
||||||
seq_impl!(<T> JsonSchema for std::collections::VecDeque<T>);
|
seq_impl!(<T> JsonSchema for std::collections::VecDeque<T>);
|
||||||
|
|
|
@ -18,7 +18,8 @@
|
||||||
"items": {
|
"items": {
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"format": "int"
|
"format": "int"
|
||||||
}
|
},
|
||||||
|
"uniqueItems": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -24,7 +24,8 @@
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
}
|
},
|
||||||
|
"uniqueItems": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -315,7 +315,8 @@
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
}
|
},
|
||||||
|
"uniqueItems": true
|
||||||
},
|
},
|
||||||
"properties": {
|
"properties": {
|
||||||
"description": "The `properties` keyword.\n\nSee [JSON Schema 9.3.2.1. \"properties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.1).",
|
"description": "The `properties` keyword.\n\nSee [JSON Schema 9.3.2.1. \"properties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.1).",
|
||||||
|
@ -670,7 +671,8 @@
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
}
|
},
|
||||||
|
"uniqueItems": true
|
||||||
},
|
},
|
||||||
"properties": {
|
"properties": {
|
||||||
"description": "The `properties` keyword.\n\nSee [JSON Schema 9.3.2.1. \"properties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.1).",
|
"description": "The `properties` keyword.\n\nSee [JSON Schema 9.3.2.1. \"properties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.1).",
|
||||||
|
|
|
@ -255,7 +255,8 @@
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
}
|
},
|
||||||
|
"uniqueItems": true
|
||||||
},
|
},
|
||||||
"properties": {
|
"properties": {
|
||||||
"description": "The `properties` keyword.\n\nSee [JSON Schema 9.3.2.1. \"properties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.1).",
|
"description": "The `properties` keyword.\n\nSee [JSON Schema 9.3.2.1. \"properties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.1).",
|
||||||
|
@ -552,7 +553,8 @@
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
}
|
},
|
||||||
|
"uniqueItems": true
|
||||||
},
|
},
|
||||||
"properties": {
|
"properties": {
|
||||||
"description": "The `properties` keyword.\n\nSee [JSON Schema 9.3.2.1. \"properties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.1).",
|
"description": "The `properties` keyword.\n\nSee [JSON Schema 9.3.2.1. \"properties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.1).",
|
||||||
|
|
|
@ -315,7 +315,8 @@
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
}
|
},
|
||||||
|
"uniqueItems": true
|
||||||
},
|
},
|
||||||
"properties": {
|
"properties": {
|
||||||
"description": "The `properties` keyword.\n\nSee [JSON Schema 9.3.2.1. \"properties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.1).",
|
"description": "The `properties` keyword.\n\nSee [JSON Schema 9.3.2.1. \"properties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.1).",
|
||||||
|
@ -674,7 +675,8 @@
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
}
|
},
|
||||||
|
"uniqueItems": true
|
||||||
},
|
},
|
||||||
"properties": {
|
"properties": {
|
||||||
"description": "The `properties` keyword.\n\nSee [JSON Schema 9.3.2.1. \"properties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.1).",
|
"description": "The `properties` keyword.\n\nSee [JSON Schema 9.3.2.1. \"properties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.1).",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue