noema 0.1.4

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);
}

pub fn gen_modules<T>(
    modules: Vec<impl Module<AppConfig = T> + 'static>,
) -> Vec<Arc<dyn Module<AppConfig = T>>> {
    modules
        .into_iter()
        .map(|m| Arc::new(m) as Arc<dyn Module<AppConfig = T>>)
        .collect()
}

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;
    }
}