use std::collections::BTreeMap;
use schemars::{JsonSchema, SchemaGenerator};
use schemars::Schema as JsonSchemaObject;
#[derive(Clone, Debug)]
pub struct ResponseConfig {
pub description: String,
pub schema: Option<JsonSchemaObject>,
}
#[derive(Clone, Debug, Default)]
pub struct RouteConfig {
pub summary: Option<String>,
pub description: Option<String>,
pub tags: Vec<String>,
pub responses: BTreeMap<u16, ResponseConfig>,
}
impl RouteConfig {
pub fn new() -> Self {
Self::default()
}
pub fn description(mut self, description: impl Into<String>) -> Self {
self.description = Some(description.into());
self
}
pub fn summary(mut self, summary: impl Into<String>) -> Self {
self.summary = Some(summary.into());
self
}
pub fn tag(mut self, tag: impl Into<String>) -> Self {
self.tags.push(tag.into());
self
}
pub fn ok<T: JsonSchema>(self) -> Self {
self.response::<T>(200, "Success")
}
pub fn response<T: JsonSchema>(mut self, status: u16, description: impl Into<String>) -> Self {
let mut generator = SchemaGenerator::default();
let schema = T::json_schema(&mut generator);
self.responses.insert(status, ResponseConfig {
description: description.into(),
schema: Some(schema),
});
self
}
pub fn empty_response(mut self, status: u16, description: impl Into<String>) -> Self {
self.responses.insert(status, ResponseConfig {
description: description.into(),
schema: None,
});
self
}
}