diff --git a/docs/_includes/examples/custom_settings.rs b/docs/_includes/examples/custom_settings.rs index 8c90980..335daf3 100644 --- a/docs/_includes/examples/custom_settings.rs +++ b/docs/_includes/examples/custom_settings.rs @@ -8,19 +8,16 @@ pub struct MyStruct { } #[derive(JsonSchema)] -pub enum MyEnum { +pub enum MyEnum { StringNewType(String), - StructVariant { - floats: Vec, - } + StructVariant { floats: Vec }, } fn main() { - let settings = SchemaSettings { - option_nullable: true, - option_add_null_type: false, - ..SchemaSettings::draft07() - }; + let settings = SchemaSettings::draft07().with(|s| { + s.option_nullable = true; + s.option_add_null_type = false; + }); let gen = settings.into_generator(); let schema = gen.into_root_schema_for::(); println!("{}", serde_json::to_string_pretty(&schema).unwrap()); diff --git a/schemars/src/json_schema_impls/core.rs b/schemars/src/json_schema_impls/core.rs index c9dd35d..de6975b 100644 --- a/schemars/src/json_schema_impls/core.rs +++ b/schemars/src/json_schema_impls/core.rs @@ -17,12 +17,13 @@ impl JsonSchema for Option { schema = match schema { Schema::Bool(true) => Schema::Bool(true), Schema::Bool(false) => <()>::json_schema(gen), - Schema::Object( - obj @ SchemaObject { - instance_type: Some(_), - .. - }, - ) => Schema::Object(with_null_type(obj)), + Schema::Object(SchemaObject { + instance_type: Some(ref mut instance_type), + .. + }) => { + add_null_type(instance_type); + schema + } schema => SchemaObject { subschemas: Some(Box::new(SubschemaValidation { any_of: Some(vec![schema, <()>::json_schema(gen)]), @@ -56,18 +57,14 @@ impl JsonSchema for Option { } } -fn with_null_type(mut obj: SchemaObject) -> SchemaObject { - match obj - .instance_type - .as_mut() - .expect("checked in calling function") - { - SingleOrVec::Single(ty) if **ty == InstanceType::Null => {} - SingleOrVec::Vec(ty) if ty.contains(&InstanceType::Null) => {} - SingleOrVec::Single(ty) => obj.instance_type = Some(vec![**ty, InstanceType::Null].into()), - SingleOrVec::Vec(ref mut ty) => ty.push(InstanceType::Null), +fn add_null_type(instance_type: &mut SingleOrVec) { + match instance_type { + SingleOrVec::Single(ty) if **ty != InstanceType::Null => { + *instance_type = vec![**ty, InstanceType::Null].into() + } + SingleOrVec::Vec(ty) if !ty.contains(&InstanceType::Null) => ty.push(InstanceType::Null), + _ => {} }; - obj } impl JsonSchema for Result {