5 releases
0.1.4 | Mar 17, 2023 |
---|---|
0.1.3 | Jan 7, 2023 |
0.1.2 | Jan 7, 2023 |
0.1.1 | Jan 7, 2023 |
0.1.0 | Jan 7, 2023 |
#3 in #inversion
22 downloads per month
21KB
216 lines
portaldi
portaldi is a ergonomic, lightweight and compile-time dependency injection (DI) library for Rust.
Features
-
Ergonomic apis for DI.
You can forcus on a target type in most cases without worrying about containers.
Hoge::di().hello();
-
Natively async support.
-
In portaldi, components and trait must be
thread-safe
(Sync + Send
) -
Asynchronous component creation is enabled.
AsyncHoge::di() .await .hello()
-
-
DRY support by proc-macros.
Almost boiler codes can be generated by portaldi's proc-macro.
#[derive(DIPortal)] struct Hoge { foo: DI<Foo>, ... }
Example
use portaldi::*;
#[derive(DIPortal)]
struct Hoge {
foo: DI<dyn FooI>,
bar: DI<Bar>,
}
impl Hoge {
fn say_hello(&self) {
println!("hello hoge < {}, {}", self.foo.hello(), self.bar.hello())
}
}
pub trait FooI: DITarget {
fn hello(&self) -> &str;
}
#[derive(DIPortal)]
#[provide(FooI)]
struct Foo {}
impl FooI for Foo {
fn hello(&self) -> &str {
"hello foo"
}
}
#[derive(DIPortal)]
struct Bar {}
impl Bar {
fn hello(&self) -> &str {
"hello bar"
}
}
fn main() {
Hoge::di().say_hello();
}
Guides
For detailed guides, see docs page
License
Licensed under either of Apache License, Version 2.0 or MIT license at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this project by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
Dependencies
~1.8–2.7MB
~68K SLoC