Skip to main content

ruest/core/
module.rs

1use crate::di::Container;
2
3use super::ModuleContext;
4
5/// Registers providers into the DI container (generated by `#[service]` / `#[module]`).
6pub type ProviderRegisterFn = fn(&Container);
7
8/// Metadata describing a NestJS-style module.
9#[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
16/// Trait implemented by all application modules (manually or via `#[module]`).
17pub 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
32/// Marker : ce module expose `wire_routes` (généré par `#[module]`).
33pub trait HttpModule: Module {}