diff options
author | Alex Auvolat <lx@deuxfleurs.fr> | 2025-01-28 15:44:14 +0100 |
---|---|---|
committer | Alex Auvolat <lx@deuxfleurs.fr> | 2025-01-29 19:26:16 +0100 |
commit | af1a53083452e7953736261db57aea4a68aa4278 (patch) | |
tree | f28c1a8b8f70b532ad1f3234a567d6bc5abac537 /src/api/admin/macros.rs | |
parent | c99bfe69ea19497895d32669fd15c689b86035d8 (diff) | |
download | garage-af1a53083452e7953736261db57aea4a68aa4278.tar.gz garage-af1a53083452e7953736261db57aea4a68aa4278.zip |
admin api: refactor using macro
Diffstat (limited to 'src/api/admin/macros.rs')
-rw-r--r-- | src/api/admin/macros.rs | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/api/admin/macros.rs b/src/api/admin/macros.rs new file mode 100644 index 00000000..a12dc40b --- /dev/null +++ b/src/api/admin/macros.rs @@ -0,0 +1,58 @@ +macro_rules! admin_endpoints { + [ + $(@special $special_endpoint:ident,)* + $($endpoint:ident,)* + ] => { + paste! { + pub enum AdminApiRequest { + $( + $special_endpoint( [<$special_endpoint Request>] ), + )* + $( + $endpoint( [<$endpoint Request>] ), + )* + } + + #[derive(Serialize)] + #[serde(untagged)] + pub enum AdminApiResponse { + $( + $endpoint( [<$endpoint Response>] ), + )* + } + + impl AdminApiRequest { + fn name(&self) -> &'static str { + match self { + $( + Self::$special_endpoint(_) => stringify!($special_endpoint), + )* + $( + Self::$endpoint(_) => stringify!($endpoint), + )* + } + } + } + + #[async_trait] + impl EndpointHandler for AdminApiRequest { + type Response = AdminApiResponse; + + async fn handle(self, garage: &Arc<Garage>) -> Result<AdminApiResponse, Error> { + Ok(match self { + $( + AdminApiRequest::$special_endpoint(_) => panic!( + concat!(stringify!($special_endpoint), " needs to go through a special handler") + ), + )* + $( + AdminApiRequest::$endpoint(req) => AdminApiResponse::$endpoint(req.handle(garage).await?), + )* + }) + } + } + } + }; +} + +pub(crate) use admin_endpoints; |