Crates.io | froodi |
lib.rs | froodi |
version | 1.0.0-beta.6 |
created_at | 2025-08-02 08:51:43.3106+00 |
updated_at | 2025-09-18 03:16:58.294461+00 |
description | An ergonomic Rust IoC container |
homepage | |
repository | https://github.com/Desiders/froodi |
max_upload_size | |
id | 1778553 |
size | 291,058 |
Froodi is a lightweight, ergonomic Inversion of Control (IoC) container for Rust that helps manage dependencies with clear scoping and lifecycle management in a simple manner
thread_safe
feature) and can be disabled to use Rc
instead of Arc
and off Send
/Sync
requirementsuse froodi::{
Container,
DefaultScope::{App, Request},
Inject, InjectTransient, InstantiatorResult, RegistryBuilder, instance,
};
#[derive(Default, Clone)]
struct Config {
_host: &'static str,
_port: i16,
_user: &'static str,
_password: &'static str,
_db: &'static str,
}
trait UserRepo {
fn create_user(&self);
}
struct PostgresUserRepo;
impl UserRepo for PostgresUserRepo {
fn create_user(&self) {
todo!()
}
}
struct CreateUser<R> {
repo: R,
}
impl<R: UserRepo> CreateUser<R> {
fn handle(&self) {
self.repo.create_user();
}
}
fn init_container(config: Config) -> Container {
#[allow(clippy::unnecessary_wraps)]
fn create_user<R>(InjectTransient(repo): InjectTransient<R>) -> InstantiatorResult<CreateUser<R>> {
Ok(CreateUser { repo })
}
let registry = RegistryBuilder::new()
.provide(instance(config), App)
.provide(|_config: Inject<Config>| Ok(PostgresUserRepo), Request)
.provide(create_user::<PostgresUserRepo>, Request);
Container::new(registry)
}
fn main() {
let app_container = init_container(Config::default());
let request_container = app_container.clone().enter_build().unwrap();
let interactor = request_container.get_transient::<CreateUser<PostgresUserRepo>>().unwrap();
interactor.handle();
let _config = request_container.get::<Config>().unwrap();
request_container.close();
app_container.close();
}
You may consider checking out this directory for examples.
Contributions are welcome!