1use crate::di::Container;
2
3use super::ModuleContext;
4
5pub type ProviderRegisterFn = fn(&Container);
7
8#[derive(Default)]
10pub struct ModuleMetadata {
11 pub imports: Vec<Box<dyn Module>>,
12 pub providers: Vec<ProviderRegisterFn>,
13 pub exports: Vec<&'static str>,
14}
15
16pub trait Module: Send + Sync {
18 fn metadata(&self) -> ModuleMetadata;
19
20 fn configure(&self, ctx: &mut ModuleContext) -> Result<(), super::CoreError> {
21 let meta = self.metadata();
22 for import in &meta.imports {
23 import.configure(ctx)?;
24 }
25 for register in meta.providers {
26 register(&ctx.container);
27 }
28 Ok(())
29 }
30}
31
32pub trait HttpModule: Module {}