From 18c2d417e359a71bed7e0f61cf4d062134c284d4 Mon Sep 17 00:00:00 2001 From: Graham Esau Date: Sat, 19 Oct 2019 21:03:34 +0100 Subject: [PATCH] Fix schema generation for flatten Options --- schemars/src/json_schema_impls/core.rs | 12 +++++++++-- schemars/src/json_schema_impls/deref.rs | 4 ++++ schemars/src/lib.rs | 2 +- schemars/tests/flatten.rs | 27 ++++++++++++++++--------- schemars_derive/src/lib.rs | 2 +- 5 files changed, 34 insertions(+), 13 deletions(-) diff --git a/schemars/src/json_schema_impls/core.rs b/schemars/src/json_schema_impls/core.rs index 813a5d1..f0bf60c 100644 --- a/schemars/src/json_schema_impls/core.rs +++ b/schemars/src/json_schema_impls/core.rs @@ -46,8 +46,16 @@ impl JsonSchema for Option { schema } - fn json_schema_non_null(gen: &mut SchemaGenerator) -> Schema { - T::json_schema_non_null(gen) + fn json_schema_optional(gen: &mut SchemaGenerator) -> Schema { + let mut schema = T::json_schema_optional(gen); + if let Schema::Object(SchemaObject { + object: Some(ref mut object_validation), + .. + }) = schema + { + object_validation.required.clear(); + } + schema } } diff --git a/schemars/src/json_schema_impls/deref.rs b/schemars/src/json_schema_impls/deref.rs index 853988e..d836090 100644 --- a/schemars/src/json_schema_impls/deref.rs +++ b/schemars/src/json_schema_impls/deref.rs @@ -19,6 +19,10 @@ macro_rules! deref_impl { fn json_schema(gen: &mut SchemaGenerator) -> Schema { T::json_schema(gen) } + + fn json_schema_optional(gen: &mut SchemaGenerator) -> Schema { + T::json_schema_optional(gen) + } } }; } diff --git a/schemars/src/lib.rs b/schemars/src/lib.rs index 20daaf7..2f3fe61 100644 --- a/schemars/src/lib.rs +++ b/schemars/src/lib.rs @@ -27,7 +27,7 @@ pub trait JsonSchema { fn json_schema(gen: &mut gen::SchemaGenerator) -> Schema; #[doc(hidden)] - fn json_schema_non_null(gen: &mut gen::SchemaGenerator) -> Schema { + fn json_schema_optional(gen: &mut gen::SchemaGenerator) -> Schema { Self::json_schema(gen) } } diff --git a/schemars/tests/flatten.rs b/schemars/tests/flatten.rs index 04224e3..a191666 100644 --- a/schemars/tests/flatten.rs +++ b/schemars/tests/flatten.rs @@ -4,31 +4,40 @@ use schemars::{schema_for, JsonSchema}; #[derive(Debug, JsonSchema)] struct Flat { - foo: f32, - bar: bool, - baz: String, - foobar: Vec, + f: f32, + b: bool, + s: String, + #[serde(default)] + os: String, + v: Vec, } #[derive(Debug, JsonSchema)] #[schemars(rename = "Flat")] struct Deep1 { - foo: f32, - #[serde(flatten)] + f: f32, + #[schemars(flatten)] deep2: Deep2, - foobar: Vec, + v: Vec, } #[derive(Debug, JsonSchema)] struct Deep2 { - bar: bool, + b: bool, #[serde(flatten)] deep3: Deep3, + #[serde(flatten)] + deep4: Box>>>, } #[derive(Debug, JsonSchema)] struct Deep3 { - baz: &'static str, + s: &'static str, +} + +#[derive(Debug, JsonSchema)] +struct Deep4 { + os: &'static str, } #[test] diff --git a/schemars_derive/src/lib.rs b/schemars_derive/src/lib.rs index 6a4453c..7aaee6e 100644 --- a/schemars_derive/src/lib.rs +++ b/schemars_derive/src/lib.rs @@ -318,7 +318,7 @@ fn schema_for_struct(fields: &[Field], cattrs: &attr::Container) -> TokenStream let flattens = flat.iter().map(|field| { let ty = get_json_schema_type(field); quote_spanned! {field.original.span()=> - .flatten(<#ty>::json_schema_non_null(gen)) + .flatten(<#ty>::json_schema_optional(gen)) } });