DEVELOPMENT ENVIRONMENT

~liljamo/canwa

5e386562eacb36c1492297fa4e0ff82054d03a33 — Jonni Liljamo 10 days ago 19620a3
feat: macro for creating service match
4 files changed, 58 insertions(+), 28 deletions(-)

M Cargo.lock
M Cargo.toml
M src/service/mod.rs
M src/state.rs
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);
        }