M Cargo.lock => Cargo.lock +30 -7
@@ 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",
]
@@ 254,6 256,12 @@ dependencies = [
]
[[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"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ 723,7 731,7 @@ checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd"
dependencies = [
"libc",
"wasi 0.11.0+wasi-snapshot-preview1",
- "windows-sys",
+ "windows-sys 0.52.0",
]
[[package]]
@@ 758,6 766,12 @@ 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"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ 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]]
@@ 1743,6 1757,15 @@ dependencies = [
]
[[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"
source = "registry+https://github.com/rust-lang/crates.io-index"
M Cargo.toml => Cargo.toml +1 -0
@@ 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",
] }
M src/service/mod.rs => src/service/mod.rs +26 -20
@@ 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<dyn std::error::Error>>;
}
+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<dyn Service + Send + Sync> {
- match service_config.typetag_name() {
- "gotify" => Box::new(gotify::GotifyService::new(
- client,
- service_config
- .as_any()
- .downcast_ref::<gotify::GotifyConfig>()
- .expect("fuck")
- .clone(),
- )),
- "matrix" => Box::new(matrix::MatrixService::new(
- client,
- service_config
- .as_any()
- .downcast_ref::<matrix::MatrixConfig>()
- .expect("fuck")
- .clone(),
- )),
- _ => unreachable!(),
- }
+) -> Result<Box<dyn Service + Send + Sync>, Box<dyn std::error::Error>> {
+ let config: Box<dyn Service + Send + Sync> =
+ make_service_match!(client, service_config, gotify, matrix);
+ Ok(config)
}
M src/state.rs => src/state.rs +1 -1
@@ 30,7 30,7 @@ impl State {
for (id, service_config) in &config.services {
let service: Box<dyn Service + Send + Sync> =
- service::build(client.clone(), &*(*service_config));
+ service::build(client.clone(), &*(*service_config))?;
services.insert(id.clone(), service);
}