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