#[module]Expand description
Annotates a impl block that defines the bindings.
To incorporate a module to the dependency graph, it should be included as a field in the
modules field in the #[component] annotation.
use lockjaw::{module};
pub struct FooModule {}
#[module]
impl FooModule {
#[provides]
pub fn provide_string() -> String {
"foo".to_owned()
}
}
#[component(modules : [FooModule])]
pub trait MyComponent {
fn string(&self) -> String;
}
pub fn main() {
let component = <dyn MyComponent>::new();
assert_eq!(component.string(), "foo");
}
epilogue!();If the module struct contains fields, it must use #[builder_modules] instead.
pub struct FooModule {
value : String
}
#[module]
impl FooModule {
#[provides]
pub fn provide_string(&self) -> String {
self.value.clone()
}
}
#[builder_modules]
pub struct MyBuilderModules {
foo : FooModule,
}
#[component(builder_modules : MyBuilderModules)]
pub trait MyComponent {
fn string(&self) -> String;
}
pub fn main() {
let component = <dyn MyComponent>::build(MyBuilderModules {
foo : FooModule {
value:"bar".to_owned()
}
});
assert_eq!(component.string(), "bar");
}
epilogue!();§Metadata
Module additional metadata in the form of
#[module(key=value, key2=value)].
§subcomponents
Optional path or array of paths to #[subcomponent] the module should bind. The
subcomponent’s builder will be bound with the module, and the subcomponent will have access to all
the bindings of the component/subcomponent the module is installed in.
§install_in
Optional path to a #[define_component]
/#[define_subcomponent] where the module will be automatically installed
in, instead of having to specify the module in a component’s modules
metadata. This allows a module to add bindings to a component that is defined in another crate the
current crate is depending on, For example injecting hooks into a library that will call it.
install_in is not allowed on modules with fields, as the component can’t understand how to create
the module automatically.
§Method attributes
Methods in a module must have one of the binding type attribute. It may also have additional binding modifiersattributes that affects the behavior of the binding.
Method attributes are nested under #[module], and all nested attributes should be unqualified (
always used as #[attribute] instead of #[lockjaw::attribute]).