diff --git a/src/openapi/types.rs b/src/openapi/types.rs index 49e5e57..c7ff5e4 100644 --- a/src/openapi/types.rs +++ b/src/openapi/types.rs @@ -10,7 +10,7 @@ use openapiv3::{ #[cfg(feature = "uuid")] use uuid::Uuid; use std::{ - collections::{BTreeSet, HashSet}, + collections::{BTreeSet, HashMap, HashSet}, hash::BuildHasher }; @@ -267,8 +267,7 @@ impl OpenapiType for Vec let schema = T::schema(); let mut dependencies = schema.dependencies.clone(); - let items = match schema.name.clone() - { + let items = match schema.name.clone() { Some(name) => { let reference = Reference { reference: format!("#/components/schemas/{}", name) }; dependencies.insert(name, schema); @@ -307,6 +306,34 @@ impl OpenapiType for HashSet } } +impl OpenapiType for HashMap +{ + fn schema() -> OpenapiSchema + { + let schema = T::schema(); + let mut dependencies = schema.dependencies.clone(); + + let items = Box::new(match schema.name.clone() { + Some(name) => { + let reference = Reference { reference: format!("#/components/schemas/{}", name) }; + dependencies.insert(name, schema); + reference + }, + None => Item(schema.into_schema()) + }); + + OpenapiSchema { + nullable: false, + name: None, + schema: SchemaKind::Type(Type::Object(ObjectType { + additional_properties: Some(AdditionalProperties::Schema(items)), + ..Default::default() + })), + dependencies + } + } +} + impl OpenapiType for serde_json::Value { fn schema() -> OpenapiSchema @@ -330,12 +357,12 @@ mod test type Unit = (); macro_rules! assert_schema { - ($ty:ident $(<$generic:ident>)* => $json:expr) => { + ($ty:ident $(<$($generic:ident),+>)* => $json:expr) => { paste::item! { #[test] - fn []() + fn []() { - let schema = <$ty $(<$generic>)* as OpenapiType>::schema().into_schema(); + let schema = <$ty $(<$($generic),+>)* as OpenapiType>::schema().into_schema(); let schema_json = serde_json::to_string(&schema).expect(&format!("Unable to serialize schema for {}", stringify!($ty))); assert_eq!(schema_json, $json); } @@ -382,6 +409,8 @@ mod test assert_schema!(Option => r#"{"nullable":true,"type":"string"}"#); assert_schema!(Vec => r#"{"type":"array","items":{"type":"string"}}"#); - + assert_schema!(BTreeSet => r#"{"type":"array","items":{"type":"string"}}"#); + assert_schema!(HashSet => r#"{"type":"array","items":{"type":"string"}}"#); + assert_schema!(HashMap => r#"{"type":"object","additionalProperties":{"type":"string"}}"#); assert_schema!(Value => r#"{"nullable":true}"#); }