Skip to content

Commit

Permalink
Update schema generics compose (#1202)
Browse files Browse the repository at this point in the history
This commit updates default `ComposeSchema` implementation for Rust
types currently implementing `ComposeSchema` with aim to fix the
incorrect schema on types having generic arguments.
  • Loading branch information
juhaku authored Nov 14, 2024
1 parent 120705a commit b5a0b11
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 47 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -74,19 +74,7 @@
"type": "string"
},
"t": {
"type": "object",
"required": [
"t"
],
"properties": {
"t": {
"type": "string",
"enum": [
"One",
"Two"
]
}
}
"type": "string"
}
}
},
Expand All @@ -97,19 +85,11 @@
],
"properties": {
"t": {
"type": "object",
"required": [
"t"
],
"properties": {
"t": {
"type": "string",
"enum": [
"One",
"Two"
]
}
}
"type": "string",
"enum": [
"One",
"Two"
]
}
}
}
Expand Down Expand Up @@ -140,7 +120,7 @@
},
"t": {
"type": "integer",
"format": "int32"
"format": "int64"
}
}
},
Expand Down
51 changes: 31 additions & 20 deletions utoipa/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1343,6 +1343,17 @@ pub mod __dev {
i8, i16, i32, i64, i128, isize, u8, u16, u32, u64, u128, usize, bool, f32, f64, String, str, char
);

fn schema_or_compose<T: ComposeSchema>(
schemas: Vec<utoipa::openapi::RefOr<utoipa::openapi::schema::Schema>>,
index: usize,
) -> utoipa::openapi::RefOr<utoipa::openapi::schema::Schema> {
if let Some(schema) = schemas.get(index) {
schema.clone()
} else {
T::compose(schemas)
}
}

impl ComposeSchema for &str {
fn compose(
schemas: Vec<utoipa::openapi::RefOr<utoipa::openapi::schema::Schema>>,
Expand All @@ -1365,7 +1376,7 @@ pub mod __dev {
utoipa::openapi::schema::ObjectBuilder::new()
.schema_type(utoipa::openapi::schema::Type::Null),
)
.item(T::compose(schemas))
.item(schema_or_compose::<T>(schemas, 0))
.into()
}
}
Expand All @@ -1375,7 +1386,7 @@ pub mod __dev {
schemas: Vec<utoipa::openapi::RefOr<utoipa::openapi::schema::Schema>>,
) -> utoipa::openapi::RefOr<utoipa::openapi::schema::Schema> {
utoipa::openapi::schema::ArrayBuilder::new()
.items(T::compose(schemas))
.items(schema_or_compose::<T>(schemas, 0))
.into()
}
}
Expand All @@ -1385,7 +1396,7 @@ pub mod __dev {
schemas: Vec<utoipa::openapi::RefOr<utoipa::openapi::schema::Schema>>,
) -> utoipa::openapi::RefOr<utoipa::openapi::schema::Schema> {
utoipa::openapi::schema::ArrayBuilder::new()
.items(T::compose(schemas))
.items(schema_or_compose::<T>(schemas, 0))
.into()
}
}
Expand All @@ -1395,7 +1406,7 @@ pub mod __dev {
schemas: Vec<utoipa::openapi::RefOr<utoipa::openapi::schema::Schema>>,
) -> utoipa::openapi::RefOr<utoipa::openapi::schema::Schema> {
utoipa::openapi::schema::ArrayBuilder::new()
.items(T::compose(schemas))
.items(schema_or_compose::<T>(schemas, 0))
.into()
}
}
Expand All @@ -1405,7 +1416,7 @@ pub mod __dev {
schemas: Vec<utoipa::openapi::RefOr<utoipa::openapi::schema::Schema>>,
) -> utoipa::openapi::RefOr<utoipa::openapi::schema::Schema> {
utoipa::openapi::schema::ArrayBuilder::new()
.items(T::compose(schemas))
.items(schema_or_compose::<T>(schemas, 0))
.into()
}
}
Expand All @@ -1415,7 +1426,7 @@ pub mod __dev {
schemas: Vec<utoipa::openapi::RefOr<utoipa::openapi::schema::Schema>>,
) -> utoipa::openapi::RefOr<utoipa::openapi::schema::Schema> {
utoipa::openapi::schema::ArrayBuilder::new()
.items(T::compose(schemas))
.items(schema_or_compose::<T>(schemas, 0))
.into()
}
}
Expand All @@ -1425,8 +1436,8 @@ pub mod __dev {
schemas: Vec<utoipa::openapi::RefOr<utoipa::openapi::schema::Schema>>,
) -> utoipa::openapi::RefOr<utoipa::openapi::schema::Schema> {
utoipa::openapi::ObjectBuilder::new()
.property_names(Some(K::compose(schemas.clone())))
.additional_properties(Some(T::compose(schemas)))
.property_names(Some(schema_or_compose::<K>(schemas.clone(), 0)))
.additional_properties(Some(schema_or_compose::<T>(schemas, 1)))
.into()
}
}
Expand All @@ -1436,8 +1447,8 @@ pub mod __dev {
schemas: Vec<utoipa::openapi::RefOr<utoipa::openapi::schema::Schema>>,
) -> utoipa::openapi::RefOr<utoipa::openapi::schema::Schema> {
utoipa::openapi::ObjectBuilder::new()
.property_names(Some(K::compose(schemas.clone())))
.additional_properties(Some(T::compose(schemas)))
.property_names(Some(schema_or_compose::<K>(schemas.clone(), 0)))
.additional_properties(Some(schema_or_compose::<T>(schemas, 1)))
.into()
}
}
Expand All @@ -1447,7 +1458,7 @@ pub mod __dev {
schemas: Vec<utoipa::openapi::RefOr<utoipa::openapi::schema::Schema>>,
) -> utoipa::openapi::RefOr<utoipa::openapi::schema::Schema> {
utoipa::openapi::schema::ArrayBuilder::new()
.items(K::compose(schemas))
.items(schema_or_compose::<K>(schemas, 0))
.unique_items(true)
.into()
}
Expand All @@ -1458,7 +1469,7 @@ pub mod __dev {
schemas: Vec<utoipa::openapi::RefOr<utoipa::openapi::schema::Schema>>,
) -> utoipa::openapi::RefOr<utoipa::openapi::schema::Schema> {
utoipa::openapi::schema::ArrayBuilder::new()
.items(K::compose(schemas))
.items(schema_or_compose::<K>(schemas, 0))
.unique_items(true)
.into()
}
Expand All @@ -1471,8 +1482,8 @@ pub mod __dev {
schemas: Vec<utoipa::openapi::RefOr<utoipa::openapi::schema::Schema>>,
) -> utoipa::openapi::RefOr<utoipa::openapi::schema::Schema> {
utoipa::openapi::ObjectBuilder::new()
.property_names(Some(K::compose(schemas.clone())))
.additional_properties(Some(T::compose(schemas)))
.property_names(Some(schema_or_compose::<K>(schemas.clone(), 0)))
.additional_properties(Some(schema_or_compose::<T>(schemas, 1)))
.into()
}
}
Expand All @@ -1484,7 +1495,7 @@ pub mod __dev {
schemas: Vec<utoipa::openapi::RefOr<utoipa::openapi::schema::Schema>>,
) -> utoipa::openapi::RefOr<utoipa::openapi::schema::Schema> {
utoipa::openapi::schema::ArrayBuilder::new()
.items(K::compose(schemas))
.items(schema_or_compose::<K>(schemas, 0))
.unique_items(true)
.into()
}
Expand All @@ -1494,23 +1505,23 @@ pub mod __dev {
fn compose(
schemas: Vec<utoipa::openapi::RefOr<utoipa::openapi::schema::Schema>>,
) -> utoipa::openapi::RefOr<utoipa::openapi::schema::Schema> {
T::compose(schemas)
schema_or_compose::<T>(schemas, 0)
}
}

impl<T: ComposeSchema> ComposeSchema for std::boxed::Box<T> {
fn compose(
schemas: Vec<utoipa::openapi::RefOr<utoipa::openapi::schema::Schema>>,
) -> utoipa::openapi::RefOr<utoipa::openapi::schema::Schema> {
T::compose(schemas)
schema_or_compose::<T>(schemas, 0)
}
}

impl<T: ComposeSchema> ComposeSchema for std::cell::RefCell<T> {
fn compose(
schemas: Vec<utoipa::openapi::RefOr<utoipa::openapi::schema::Schema>>,
) -> utoipa::openapi::RefOr<utoipa::openapi::schema::Schema> {
T::compose(schemas)
schema_or_compose::<T>(schemas, 0)
}
}

Expand All @@ -1520,7 +1531,7 @@ pub mod __dev {
fn compose(
schemas: Vec<utoipa::openapi::RefOr<utoipa::openapi::schema::Schema>>,
) -> utoipa::openapi::RefOr<utoipa::openapi::schema::Schema> {
T::compose(schemas)
schema_or_compose::<T>(schemas, 0)
}
}

Expand All @@ -1530,7 +1541,7 @@ pub mod __dev {
fn compose(
schemas: Vec<utoipa::openapi::RefOr<utoipa::openapi::schema::Schema>>,
) -> utoipa::openapi::RefOr<utoipa::openapi::schema::Schema> {
T::compose(schemas)
schema_or_compose::<T>(schemas, 0)
}
}

Expand Down

0 comments on commit b5a0b11

Please sign in to comment.