Crates.io | instancebuilder |
lib.rs | instancebuilder |
version | 0.2.0 |
source | src |
created_at | 2024-03-27 10:20:44.639934 |
updated_at | 2024-07-30 14:12:48.819382 |
description | Convenient way of managing dependency injection |
homepage | |
repository | https://github.com/mrcrgl/processmanager-rs |
max_upload_size | |
id | 1187758 |
size | 9,446 |
Handy solution for dependency injection in Rust.
cargo add instancebuilder
use ::std::convert::Infallible;
use ::instancebuilder::{Error, InstanceBuilder, FromInstanceBuilder};
// Example set of data of any type. Must implement Send + Sync to be threadsafe.
struct TestConfig {
key: String,
}
// Your implementation that needs to get build.
struct TestImplementation {
message: String,
}
impl FromInstanceBuilder for TestImplementation {
fn try_from_builder(builder: &InstanceBuilder) -> Result<Self, Error> {
// Put here the code necessary to build the instance
let config: &TestConfig = builder.data()?;
Ok(Self {
message: config.key.clone(),
})
}
}
fn main() {
// Test object to inject. This can be a database pool or a shared instance of something
let config = TestConfig {
key: String::from("help me!"),
};
let mut builder = InstanceBuilder::new();
// Add dependency object to the builder
builder.insert(config);
// Build instance of the implementation
// dependencies are injected by the `FromInstanceBuilder` trait implementation
let instance = builder.build::<TestImplementation>().unwrap();
}
use ::std::convert::Infallible;
use ::instancebuilder::{Error, InstanceBuilder, FromInstanceBuilder};
// Example set of data of any type. Must implement Send + Sync to be threadsafe.
struct TestConfig {
key: String,
}
// Nested dependent struct
struct InnerTestImplementation {
message: String,
}
impl FromInstanceBuilder for InnerTestImplementation {
fn try_from_builder(builder: &InstanceBuilder) -> Result<Self, Error> {
// Put here the code necessary to build the instance
// the builder instance contains the initialized data
let config: &TestConfig = builder.data()?;
Ok(Self {
message: config.key.clone(),
})
}
}
// Outer struct that depends on the nested one
struct OuterTestImplementation {
inner: InnerTestImplementation,
}
impl FromInstanceBuilder for OuterTestImplementation {
fn try_from_builder(builder: &InstanceBuilder) -> Result<Self, Error> {
// Put here the code necessary to build the instance
Ok(Self {
// Builds dependency `InnerTestImplementation`
inner: builder.build()?,
})
}
}
fn main() {
// Test object to inject. This can be a database pool or a shared instance of something
let config = TestConfig {
key: String::from("help me!"),
};
let mut builder = InstanceBuilder::new();
// Add dependency object to the builder
builder.insert(config);
// Build instance of the implementation
// dependencies are injected by the `FromInstanceBuilder` trait implementation
let instance = builder.build::<OuterTestImplementation>().unwrap();
}