use crate::di::Container;
use super::ModuleContext;
pub type ProviderRegisterFn = fn(&Container);
#[derive(Default)]
pub struct ModuleMetadata {
pub imports: Vec<Box<dyn Module>>,
pub providers: Vec<ProviderRegisterFn>,
pub exports: Vec<&'static str>,
}
pub trait Module: Send + Sync {
fn metadata(&self) -> ModuleMetadata;
fn configure(&self, ctx: &mut ModuleContext) -> Result<(), super::CoreError> {
let meta = self.metadata();
for import in &meta.imports {
import.configure(ctx)?;
}
for register in meta.providers {
register(&ctx.container);
}
Ok(())
}
}
pub trait HttpModule: Module {}