1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
use crate::ModuleBuildContext; use std::any::Any; /// A module represents a group of services. By implementing traits such as [`HasComponent`] on a /// module, service dependencies are checked at compile time. At runtime, modules hold the /// components they are associated with. /// /// Modules can also use other modules as submodules, importing specific services for the root /// module's use. For more details, see the [`module`] macro. /// /// Modules are usually created via the [`module`] macro. /// /// # Example /// ``` /// use shaku::{module, Component, Interface}; /// /// trait MyComponent: Interface {} /// /// #[derive(Component)] /// #[shaku(interface = MyComponent)] /// struct MyComponentImpl; /// impl MyComponent for MyComponentImpl {} /// /// // MyModule implements Module and HasComponent<dyn MyComponent> /// module! { /// MyModule { /// components = [MyComponentImpl], /// providers = [] /// } /// } /// # fn main() {} /// ``` /// /// [`HasComponent`]: trait.HasComponent.html /// [`module`]: macro.module.html pub trait Module: ModuleInterface { /// A container for this module's submodules. type Submodules; /// Create the module instance by resolving the components this module /// provides. fn build(context: ModuleBuildContext<Self>) -> Self where Self: Sized; } #[cfg(not(feature = "thread_safe"))] trait_alias!( /// Submodules must be `'static` in order to be stored in other modules /// (hence the `Any` requirement). /// /// The `thread_safe` feature is turned off, so submodules do not need to /// implement `Send` or `Sync`. pub ModuleInterface = Any ); #[cfg(feature = "thread_safe")] trait_alias!( /// Submodules must be `'static` in order to be stored in other modules /// (hence the `Any` requirement). /// /// The `thread_safe` feature is turned on, which requires submodules to /// also implement `Send` and `Sync`. pub ModuleInterface = Any + Send + Sync );