use axum::{Router, middleware, response::Response};
use utoipa_swagger_ui::{Config as SwaggerConfig, SwaggerUi};
use xecute::{ApiOperation, DocumentationError};
use crate::configs::Config;
#[derive(Clone)]
pub(super) struct SwaggerAsset;
async fn mark_documentation(mut response: Response) -> Response {
response.extensions_mut().insert(SwaggerAsset);
response
}
pub fn router(
config: &Config,
operations: Vec<ApiOperation>,
) -> Result<Router, DocumentationError> {
if !config.docs.enabled {
return Ok(Router::new());
}
let document = xecute::openapi_document(
env!("CARGO_PKG_NAME"),
env!("CARGO_PKG_VERSION"),
operations,
)?;
Ok(Router::new()
.merge(
SwaggerUi::new("/docs")
.external_url_unchecked("/docs/openapi.json", document)
.config(
SwaggerConfig::default()
.validator_url("none")
.query_config_enabled(false),
),
)
.layer(middleware::map_response(mark_documentation)))
}