From 364d0e0192bf619249e23ab4096d4572193c5816 Mon Sep 17 00:00:00 2001 From: Alexander Berger Date: Fri, 25 Sep 2020 19:50:54 +0200 Subject: [PATCH] Add support to enforce inlining of all subschemas instead of using references. (#44) This is needed to support use cases like openAPIV3Schema in Kubernetes CustomResourceDefinitions. Co-authored-by: alex.berger@nexiot.ch --- schemars/src/gen.rs | 9 +++++++- .../tests/expected/inline-subschemas.json | 23 +++++++++++++++++++ schemars/tests/inline_subschemas.rs | 21 +++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 schemars/tests/expected/inline-subschemas.json create mode 100644 schemars/tests/inline_subschemas.rs diff --git a/schemars/src/gen.rs b/schemars/src/gen.rs index de35268..5ef54b5 100644 --- a/schemars/src/gen.rs +++ b/schemars/src/gen.rs @@ -39,6 +39,10 @@ pub struct SchemaSettings { pub meta_schema: Option, /// A list of visitors that get applied to all generated root schemas. pub visitors: Vec>, + /// Inline all subschemas instead of using references. + /// + /// Defaults to `false`. + pub inline_subschemas: bool, _hidden: (), } @@ -57,6 +61,7 @@ impl SchemaSettings { definitions_path: "#/definitions/".to_owned(), meta_schema: Some("http://json-schema.org/draft-07/schema#".to_owned()), visitors: vec![Box::new(RemoveRefSiblings)], + inline_subschemas: false, _hidden: (), } } @@ -69,6 +74,7 @@ impl SchemaSettings { definitions_path: "#/definitions/".to_owned(), meta_schema: Some("https://json-schema.org/draft/2019-09/schema".to_owned()), visitors: Vec::default(), + inline_subschemas: false, _hidden: (), } } @@ -92,6 +98,7 @@ impl SchemaSettings { retain_examples: false, }), ], + inline_subschemas: false, _hidden: (), } } @@ -196,7 +203,7 @@ impl SchemaGenerator { /// If `T`'s schema depends on any [referenceable](JsonSchema::is_referenceable) schemas, then this method will /// add them to the `SchemaGenerator`'s schema definitions. pub fn subschema_for(&mut self) -> Schema { - if !T::is_referenceable() { + if !T::is_referenceable() || self.settings.inline_subschemas { return T::json_schema(self); } diff --git a/schemars/tests/expected/inline-subschemas.json b/schemars/tests/expected/inline-subschemas.json new file mode 100644 index 0000000..0571675 --- /dev/null +++ b/schemars/tests/expected/inline-subschemas.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "properties": { + "spec": { + "properties": { + "replicas": { + "format": "uint32", + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "replicas" + ], + "type": "object" + } + }, + "required": [ + "spec" + ], + "title": "MyJob", + "type": "object" +} \ No newline at end of file diff --git a/schemars/tests/inline_subschemas.rs b/schemars/tests/inline_subschemas.rs new file mode 100644 index 0000000..62bc7cc --- /dev/null +++ b/schemars/tests/inline_subschemas.rs @@ -0,0 +1,21 @@ +mod util; +use schemars::gen::SchemaSettings; +use schemars::JsonSchema; +use util::*; + +#[derive(Debug, JsonSchema)] +pub struct MyJob { + pub spec: MyJobSpec, +} + +#[derive(Debug, JsonSchema)] +pub struct MyJobSpec { + pub replicas: u32, +} + +#[test] +fn struct_normal() -> TestResult { + let mut settings = SchemaSettings::openapi3(); + settings.inline_subschemas = true; + test_generated_schema::("inline-subschemas", settings) +}