use loco_rs::app::AppContext;
use std::sync::{Mutex, OnceLock};
use utoipa_axum::router::{OpenApiRouter, UtoipaMethodRouter};
static OPENAPI_ROUTES: OnceLock<Mutex<Vec<OpenApiRouter<AppContext>>>> = OnceLock::new();
fn get_routes() -> &'static Mutex<Vec<OpenApiRouter<AppContext>>> {
OPENAPI_ROUTES.get_or_init(|| Mutex::new(Vec::new()))
}
pub fn add_route(route: OpenApiRouter<AppContext>) {
if let Ok(mut routes) = get_routes().lock() {
routes.push(route);
}
}
pub fn clear_routes() {
if let Ok(mut routes) = get_routes().lock() {
routes.clear();
}
}
#[must_use]
pub fn get_merged_router() -> OpenApiRouter<AppContext> {
let mut result = OpenApiRouter::new();
if let Ok(routes) = get_routes().lock() {
for route in routes.iter() {
result = result.merge(route.clone());
}
}
result
}
pub fn openapi(
method: axum::routing::MethodRouter<AppContext>,
method_openapi: UtoipaMethodRouter<AppContext>,
) -> axum::routing::MethodRouter<AppContext> {
let router = OpenApiRouter::new().routes(method_openapi);
add_route(router);
method
}