From 539a4a1eadfb23893cb400bf59bc5d4bae2241d8 Mon Sep 17 00:00:00 2001 From: polyprogrammist Date: Fri, 4 Apr 2025 18:10:16 +0700 Subject: [PATCH 1/3] tmp --- okapi/src/merge.rs | 21 ++++++++++++++++++++- okapi/src/openapi3.rs | 7 +++++-- rocket-okapi/src/gen.rs | 2 +- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/okapi/src/merge.rs b/okapi/src/merge.rs index fbe3257a..c0fc02b0 100644 --- a/okapi/src/merge.rs +++ b/okapi/src/merge.rs @@ -151,7 +151,7 @@ pub fn merge_components( } else { if let Some(s1) = s1 { let s2 = s2.as_ref().unwrap(); - merge_map(&mut s1.schemas, &s2.schemas, "schemas"); + merge_map_json(&mut s1.schemas, s2.schemas.clone(), "schemas"); merge_map(&mut s1.responses, &s2.responses, "responses"); merge_map(&mut s1.parameters, &s2.parameters, "parameters"); merge_map(&mut s1.examples, &s2.examples, "examples"); @@ -264,6 +264,25 @@ pub fn merge_option(s1: &mut Option, s2: &Option) { } } +pub fn merge_map_json(s1: &mut serde_json::Value, s2: serde_json::Value, name: &str) { + if let serde_json::Value::Object(s1) = s1 { + if let serde_json::Value::Object(s2) = s2 { + for (k, v) in s2 { + if v.is_null() { + s1.remove(&k); + } + else { + merge_map_json(s1.entry(k).or_insert(serde_json::Value::Null), v, name); + } + } + + return; + } + } + + *s1 = s2; +} + /// Merge `Map`/`&Map`: /// Merge together. If key already exists, use s1 version. pub fn merge_map( diff --git a/okapi/src/openapi3.rs b/okapi/src/openapi3.rs index 3063d00c..2f355b4b 100644 --- a/okapi/src/openapi3.rs +++ b/okapi/src/openapi3.rs @@ -210,12 +210,15 @@ pub struct Responses { pub extensions: Object, } +pub type SchemasType = serde_json::Value; +// pub type SchemasType = Map; + #[derive(Debug, Clone, PartialEq, Deserialize, Serialize, Default)] #[cfg_attr(feature = "impl_json_schema", derive(JsonSchema))] #[serde(default, rename_all = "camelCase")] pub struct Components { - #[serde(default, skip_serializing_if = "Map::is_empty")] - pub schemas: Map, + // #[serde(default, skip_serializing_if = "Map::is_empty")] + pub schemas: SchemasType, #[serde(default, skip_serializing_if = "Map::is_empty")] pub responses: Map>, #[serde(default, skip_serializing_if = "Map::is_empty")] diff --git a/rocket-okapi/src/gen.rs b/rocket-okapi/src/gen.rs index 0a0882aa..006c669c 100644 --- a/rocket-okapi/src/gen.rs +++ b/rocket-okapi/src/gen.rs @@ -109,7 +109,7 @@ impl OpenApiGenerator { paths }, components: Some(Components { - schemas: schemas.into_iter().map(|(k, v)| (k, v.into())).collect(), + // schemas: schemas.into_iter().map(|(k, v)| (k, v.into())).collect(), security_schemes: schemes, ..Default::default() }), From d9601421c07a67870a2e96f102f1bdbd737b9541 Mon Sep 17 00:00:00 2001 From: polyprogrammist Date: Fri, 18 Apr 2025 18:40:58 +0700 Subject: [PATCH 2/3] add feature --- okapi/src/merge.rs | 4 ++++ okapi/src/openapi3.rs | 10 +++++----- rocket-okapi/src/gen.rs | 3 ++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/okapi/src/merge.rs b/okapi/src/merge.rs index c0fc02b0..2206368a 100644 --- a/okapi/src/merge.rs +++ b/okapi/src/merge.rs @@ -151,7 +151,10 @@ pub fn merge_components( } else { if let Some(s1) = s1 { let s2 = s2.as_ref().unwrap(); + #[cfg(feature = "schemars-alpha")] merge_map_json(&mut s1.schemas, s2.schemas.clone(), "schemas"); + #[cfg(not(feature = "schemars-alpha"))] + merge_map(&mut s1.schemas, &s2.schemas, "schemas"); merge_map(&mut s1.responses, &s2.responses, "responses"); merge_map(&mut s1.parameters, &s2.parameters, "parameters"); merge_map(&mut s1.examples, &s2.examples, "examples"); @@ -264,6 +267,7 @@ pub fn merge_option(s1: &mut Option, s2: &Option) { } } +#[cfg(feature = "schemars-alpha")] pub fn merge_map_json(s1: &mut serde_json::Value, s2: serde_json::Value, name: &str) { if let serde_json::Value::Object(s1) = s1 { if let serde_json::Value::Object(s2) = s2 { diff --git a/okapi/src/openapi3.rs b/okapi/src/openapi3.rs index 2f355b4b..060ad90b 100644 --- a/okapi/src/openapi3.rs +++ b/okapi/src/openapi3.rs @@ -210,15 +210,15 @@ pub struct Responses { pub extensions: Object, } -pub type SchemasType = serde_json::Value; -// pub type SchemasType = Map; - #[derive(Debug, Clone, PartialEq, Deserialize, Serialize, Default)] #[cfg_attr(feature = "impl_json_schema", derive(JsonSchema))] #[serde(default, rename_all = "camelCase")] pub struct Components { - // #[serde(default, skip_serializing_if = "Map::is_empty")] - pub schemas: SchemasType, + #[cfg(feature = "schemars-alpha")] + pub schemas: serde_json::Value, + #[cfg(not(feature = "schemars-alpha"))] + #[serde(default, skip_serializing_if = "Map::is_empty")] + pub schemas: Map, #[serde(default, skip_serializing_if = "Map::is_empty")] pub responses: Map>, #[serde(default, skip_serializing_if = "Map::is_empty")] diff --git a/rocket-okapi/src/gen.rs b/rocket-okapi/src/gen.rs index 006c669c..25f9de5a 100644 --- a/rocket-okapi/src/gen.rs +++ b/rocket-okapi/src/gen.rs @@ -109,7 +109,8 @@ impl OpenApiGenerator { paths }, components: Some(Components { - // schemas: schemas.into_iter().map(|(k, v)| (k, v.into())).collect(), + #[cfg(not(feature = "schemars-alpha"))] + schemas: schemas.into_iter().map(|(k, v)| (k, v.into())).collect(), security_schemes: schemes, ..Default::default() }), From 181b76ddacca310578ddf96e938af7bbb0e667f4 Mon Sep 17 00:00:00 2001 From: polyprogrammist Date: Mon, 21 Apr 2025 19:33:43 +0800 Subject: [PATCH 3/3] add schemars-alpha feature --- okapi/Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/okapi/Cargo.toml b/okapi/Cargo.toml index 60e23bec..3e7952bd 100644 --- a/okapi/Cargo.toml +++ b/okapi/Cargo.toml @@ -21,6 +21,7 @@ log = { workspace = true } impl_json_schema = ["schemars/impl_json_schema"] # Preserve the order of items in schema and other part of the OpenAPI documentation. preserve_order = ["schemars/preserve_order"] +schemars-alpha = [] [package.metadata.docs.rs] all-features = true