Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions okapi/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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
23 changes: 23 additions & 0 deletions okapi/src/merge.rs
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,9 @@ 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");
Expand Down Expand Up @@ -264,6 +267,26 @@ pub fn merge_option<T: Clone>(s1: &mut Option<T>, s2: &Option<T>) {
}
}

#[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 {
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<String, _>`/`&Map<String, _>`:
/// Merge together. If key already exists, use s1 version.
pub fn merge_map<T: Clone + PartialEq + std::fmt::Debug>(
Expand Down
3 changes: 3 additions & 0 deletions okapi/src/openapi3.rs
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,9 @@ pub struct Responses {
#[cfg_attr(feature = "impl_json_schema", derive(JsonSchema))]
#[serde(default, rename_all = "camelCase")]
pub struct Components {
#[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<String, SchemaObject>,
#[serde(default, skip_serializing_if = "Map::is_empty")]
Expand Down
1 change: 1 addition & 0 deletions rocket-okapi/src/gen.rs
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ impl OpenApiGenerator {
paths
},
components: Some(Components {
#[cfg(not(feature = "schemars-alpha"))]
schemas: schemas.into_iter().map(|(k, v)| (k, v.into())).collect(),
security_schemes: schemes,
..Default::default()
Expand Down