diff options
| author | rtkay123 <dev@kanjala.com> | 2026-04-03 14:43:54 +0200 |
|---|---|---|
| committer | rtkay123 <dev@kanjala.com> | 2026-04-03 14:43:54 +0200 |
| commit | 41d90f42c37df06dabfd717d19f3dc72b5ba2d11 (patch) | |
| tree | 2da259062cbdb459a2958d0be46eed20642b355a /crates/api-base/src/version.rs | |
| parent | 898a2966975c7397e35d8df6b72df42147bf18bd (diff) | |
| download | sellershut-41d90f42c37df06dabfd717d19f3dc72b5ba2d11.tar.bz2 sellershut-41d90f42c37df06dabfd717d19f3dc72b5ba2d11.zip | |
feat: openapi
Diffstat (limited to 'crates/api-base/src/version.rs')
| -rw-r--r-- | crates/api-base/src/version.rs | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/crates/api-base/src/version.rs b/crates/api-base/src/version.rs new file mode 100644 index 0000000..0652c6e --- /dev/null +++ b/crates/api-base/src/version.rs @@ -0,0 +1,45 @@ +#[derive(Debug)] +#[cfg_attr( + feature = "utoipa", + derive(utoipa::ToSchema, serde::Deserialize, serde::Serialize), + schema(example = "v0"), + serde(rename_all = "lowercase") +)] +pub enum Version { + V0, +} + +#[cfg(feature = "axum")] +mod request { + use super::*; + use axum::RequestPartsExt; + use axum::extract::{FromRequestParts, Path}; + use axum::http::StatusCode; + use axum::http::request::Parts; + use axum::response::{IntoResponse, Response}; + use std::collections::HashMap; + + impl<S> FromRequestParts<S> for Version + where + S: Send + Sync, + { + type Rejection = Response; + + async fn from_request_parts( + parts: &mut Parts, + _state: &S, + ) -> Result<Self, Self::Rejection> { + let params: Path<HashMap<String, String>> = + parts.extract().await.map_err(IntoResponse::into_response)?; + + let version = params + .get("apiVersion") + .ok_or_else(|| (StatusCode::NOT_FOUND, "version param missing").into_response())?; + + match version.as_str() { + "v0" => Ok(Version::V0), + _ => Err((StatusCode::NOT_FOUND, "unknown version").into_response()), + } + } + } +} |
