use indexmap::IndexMap;
use mime::Mime;
use openapiv3::MediaType;
use openapiv3::ReferenceOr;
use openapiv3::Response;
use openapiv3::Responses;
use openapiv3::StatusCode;
use schemars::JsonSchema;
use crate::internals::SchemaGenerator;
#[cfg(feature = "actix")]
mod actix;
#[cfg(feature = "axum")]
mod axum;
mod utils;
pub trait AsResponses {
fn responses(gen: &mut SchemaGenerator) -> Responses;
}
pub fn simple_responses(responses: impl IntoIterator<Item = SimpleResponse>) -> Responses {
Responses {
responses: responses
.into_iter()
.map(|response: SimpleResponse| {
(
response.status_code,
ReferenceOr::Item(Response {
description: response.description,
content: FromIterator::from_iter([(
response.mime_type.to_string(),
response.media_type.unwrap_or_default(),
)]),
..Default::default()
}),
)
})
.collect(),
..Default::default()
}
}
pub struct SimpleResponse {
pub status_code: StatusCode,
pub mime_type: Mime,
pub description: String,
pub media_type: Option<MediaType>,
}
pub fn ok_text() -> Responses {
simple_responses([SimpleResponse {
status_code: StatusCode::Code(200),
mime_type: mime::TEXT_PLAIN_UTF_8,
description: "Some plain text".to_string(),
media_type: None,
}])
}
pub fn ok_binary() -> Responses {
simple_responses([SimpleResponse {
status_code: StatusCode::Code(200),
mime_type: mime::APPLICATION_OCTET_STREAM,
description: "Some binary data".to_string(),
media_type: None,
}])
}
pub fn ok_empty() -> Responses {
Responses {
responses: IndexMap::from([(
StatusCode::Code(200),
ReferenceOr::Item(Response {
description: "Empty body".to_string(),
..Default::default()
}),
)]),
..Default::default()
}
}
pub fn ok_json<T: JsonSchema>(gen: &mut SchemaGenerator) -> Responses {
simple_responses([
SimpleResponse {
status_code: StatusCode::Code(200),
mime_type: mime::APPLICATION_JSON,
description: "".to_string(), media_type: Some(MediaType {
schema: Some(gen.generate::<T>()),
..Default::default()
}),
},
])
}