summaryrefslogtreecommitdiffstats
path: root/crates/sellershut/src/server.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/sellershut/src/server.rs')
-rw-r--r--crates/sellershut/src/server.rs42
1 files changed, 42 insertions, 0 deletions
diff --git a/crates/sellershut/src/server.rs b/crates/sellershut/src/server.rs
new file mode 100644
index 0000000..cee6146
--- /dev/null
+++ b/crates/sellershut/src/server.rs
@@ -0,0 +1,42 @@
+mod doc;
+mod middleware;
+mod routes;
+
+use axum::Router;
+use utoipa::OpenApi as _;
+use utoipa_axum::{router::OpenApiRouter, routes};
+
+#[cfg(feature = "redoc")]
+use utoipa_redoc::Servable as _;
+#[cfg(feature = "scalar")]
+use utoipa_scalar::Servable as _;
+
+use crate::{config::Cli, server::doc::ApiDoc};
+
+pub fn router(config: &Cli) -> Router {
+ let (router, _api) = OpenApiRouter::with_openapi(ApiDoc::openapi())
+ .routes(routes!(routes::health_check))
+ .split_for_parts();
+
+ #[cfg(feature = "swagger-ui")]
+ let router = router.merge(
+ utoipa_swagger_ui::SwaggerUi::new("/swagger-ui")
+ .url("/api-docs/swaggerdoc.json", _api.clone()),
+ );
+
+ #[cfg(feature = "redoc")]
+ let router = router.merge(utoipa_redoc::Redoc::with_url("/redoc", _api.clone()));
+
+ #[cfg(feature = "rapidoc")]
+ let router = router.merge(
+ utoipa_rapidoc::RapiDoc::with_openapi("/api-docs/rapidoc.json", _api.clone())
+ .path("/rapidoc"),
+ );
+
+ #[cfg(feature = "scalar")]
+ let router = router.merge(utoipa_scalar::Scalar::with_url("/scalar", _api));
+
+ let router = middleware::timeout::apply(router, config.timeout_duration);
+
+ middleware::request_id::apply(router)
+}