use schemars::{
gen::SchemaSettings,
schema::{InstanceType, RootSchema, Schema, SchemaObject},
visit::{visit_schema_object, Visitor},
};
#[must_use]
pub fn settings_draft201909() -> SchemaSettings {
SchemaSettings::draft2019_09()
.with_visitor(RemoveAdditionalPropertiesFalseVisitor)
.with_visitor(AddUnevaluatedPropertiesFalseRootVisitor)
.with_visitor(AddDollarSchemaPropertyRootVisitor)
}
#[derive(Debug, Clone)]
struct RemoveAdditionalPropertiesFalseVisitor;
impl Visitor for RemoveAdditionalPropertiesFalseVisitor {
fn visit_schema_object(&mut self, schema: &mut SchemaObject) {
if let Some(obj) = &mut schema.object {
if let Some(additional_props) = &obj.additional_properties {
if let Schema::Bool(false) = additional_props.as_ref() {
obj.additional_properties = None;
}
}
}
visit_schema_object(self, schema);
}
}
#[derive(Debug, Clone)]
struct AddUnevaluatedPropertiesFalseRootVisitor;
impl Visitor for AddUnevaluatedPropertiesFalseRootVisitor {
fn visit_root_schema(&mut self, root: &mut RootSchema) {
if root.schema.has_type(InstanceType::Object) {
root.schema
.extensions
.insert("unevaluatedProperties".to_string(), false.into());
}
}
}
#[derive(Debug, Clone)]
struct AddDollarSchemaPropertyRootVisitor;
impl Visitor for AddDollarSchemaPropertyRootVisitor {
fn visit_root_schema(&mut self, root: &mut RootSchema) {
if root.schema.has_type(InstanceType::Object) {
root.schema.object().properties.insert(
"$schema".to_string(),
SchemaObject {
instance_type: Some(InstanceType::String.into()),
..Default::default()
}
.into(),
);
}
}
}