From 5e386562eacb36c1492297fa4e0ff82054d03a33 Mon Sep 17 00:00:00 2001 From: Jonni Liljamo Date: Mon, 24 Nov 2025 21:18:04 +0200 Subject: [PATCH] feat: macro for creating service match --- Cargo.lock | 37 ++++++++++++++++++++++++++++++------- Cargo.toml | 1 + src/service/mod.rs | 46 ++++++++++++++++++++++++++-------------------- src/state.rs | 2 +- 4 files changed, 58 insertions(+), 28 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d497f96..0d9f421 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -155,6 +155,7 @@ dependencies = [ "async-trait", "axum", "clap", + "pastey", "pulldown-cmark", "reqwest", "serde", @@ -169,10 +170,11 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.17" +version = "1.2.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" +checksum = "cd405d82c84ff7f35739f175f67d8b9fb7687a0e84ccdc78bd3568839827cf07" dependencies = [ + "find-msvc-tools", "shlex", ] @@ -253,6 +255,12 @@ dependencies = [ "typeid", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" + [[package]] name = "fnv" version = "1.0.7" @@ -723,7 +731,7 @@ checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -757,6 +765,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "pastey" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d6c094ee800037dff99e02cab0eaf3142826586742a270ab3d7a62656bd27a" + [[package]] name = "percent-encoding" version = "2.3.1" @@ -862,7 +876,7 @@ dependencies = [ "once_cell", "socket2", "tracing", - "windows-sys", + "windows-sys 0.59.0", ] [[package]] @@ -1008,7 +1022,7 @@ dependencies = [ "getrandom 0.2.15", "libc", "untrusted", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -1178,7 +1192,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -1292,7 +1306,7 @@ dependencies = [ "pin-project-lite", "socket2", "tokio-macros", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -1742,6 +1756,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-targets" version = "0.52.6" diff --git a/Cargo.toml b/Cargo.toml index 230a028..4ec169c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,6 +25,7 @@ clap = { version = "4", default-features = false, features = [ "help", "std", ] } +pastey = "0.2.0" pulldown-cmark = { version = "0.13", default-features = false, features = [ "html", ] } diff --git a/src/service/mod.rs b/src/service/mod.rs index 5aa5480..043c056 100644 --- a/src/service/mod.rs +++ b/src/service/mod.rs @@ -6,6 +6,7 @@ */ use async_trait::async_trait; +use pastey::paste; use crate::{MessageForm, config::ServiceConfig}; @@ -17,27 +18,32 @@ pub trait Service { async fn send(&self, form: &MessageForm) -> Result<(), Box>; } +macro_rules! make_service_match { + ($client:expr, $service_config:expr, $service:expr) => { + paste! { + Box::new($service::[<$service:upper_camel Service>]::new( + $client, + $service_config + .as_any() + .downcast_ref::<$service::[<$service:upper_camel Config>]>() + .ok_or("no such service")?.clone(), + )) + } + }; + ($client:expr, $service_config:expr, $($service:expr),+) => { + match $service_config.typetag_name() { + $(stringify!($service) => make_service_match!($client, $service_config, $service)),+, + _ => unreachable!(), + + } + }; +} + pub fn build( client: reqwest::Client, service_config: &dyn ServiceConfig, -) -> Box { - match service_config.typetag_name() { - "gotify" => Box::new(gotify::GotifyService::new( - client, - service_config - .as_any() - .downcast_ref::() - .expect("fuck") - .clone(), - )), - "matrix" => Box::new(matrix::MatrixService::new( - client, - service_config - .as_any() - .downcast_ref::() - .expect("fuck") - .clone(), - )), - _ => unreachable!(), - } +) -> Result, Box> { + let config: Box = + make_service_match!(client, service_config, gotify, matrix); + Ok(config) } diff --git a/src/state.rs b/src/state.rs index 488e755..706e57e 100644 --- a/src/state.rs +++ b/src/state.rs @@ -30,7 +30,7 @@ impl State { for (id, service_config) in &config.services { let service: Box = - service::build(client.clone(), &*(*service_config)); + service::build(client.clone(), &*(*service_config))?; services.insert(id.clone(), service); } -- 2.44.1