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