noema 0.1.5

Noema IOC and DI framework for Rust
Documentation
use std::sync::Arc;

#[async_trait::async_trait]
pub trait Module: Send + Sync {
    type AppConfig;
    fn name(&self) -> &'static str {
        std::any::type_name::<Self>()
    }
    async fn init(&self) {}
    fn configure(&self, cfg: &mut Self::AppConfig);
}

#[macro_export]
macro_rules! modules {
    ($($m:expr),+ $(,)?) => {{
        vec![$(std::sync::Arc::new($m) as _),+]
    }};
}

pub fn config_modules<T>(modules: &[Arc<dyn Module<AppConfig = T>>], cfg: &mut T) {
    for module in modules {
        module.configure(cfg);
    }
}

pub async fn init_modules<T>(modules: &[Arc<dyn Module<AppConfig = T>>]) {
    for module in modules {
        module.init().await;
    }
}