Small refactor
This commit is contained in:
parent
0198ede4b6
commit
1605a8a34d
2 changed files with 20 additions and 26 deletions
|
@ -10,17 +10,14 @@ pub struct MyStruct {
|
|||
#[derive(JsonSchema)]
|
||||
pub enum MyEnum {
|
||||
StringNewType(String),
|
||||
StructVariant {
|
||||
floats: Vec<f32>,
|
||||
}
|
||||
StructVariant { floats: Vec<f32> },
|
||||
}
|
||||
|
||||
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::<MyStruct>();
|
||||
println!("{}", serde_json::to_string_pretty(&schema).unwrap());
|
||||
|
|
|
@ -17,12 +17,13 @@ impl<T: JsonSchema> JsonSchema for Option<T> {
|
|||
schema = match schema {
|
||||
Schema::Bool(true) => Schema::Bool(true),
|
||||
Schema::Bool(false) => <()>::json_schema(gen),
|
||||
Schema::Object(
|
||||
obj @ SchemaObject {
|
||||
instance_type: Some(_),
|
||||
Schema::Object(SchemaObject {
|
||||
instance_type: Some(ref mut instance_type),
|
||||
..
|
||||
},
|
||||
) => Schema::Object(with_null_type(obj)),
|
||||
}) => {
|
||||
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<T: JsonSchema> JsonSchema for Option<T> {
|
|||
}
|
||||
}
|
||||
|
||||
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<InstanceType>) {
|
||||
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<T: JsonSchema, E: JsonSchema> JsonSchema for Result<T, E> {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue