Ferrunix

A simple, idiomatic, and lightweight dependency injection framework for Rust.

[![Build Status](https://github.com/leandros/ferrunix/actions/workflows/ci.yml/badge.svg)](https://github.com/leandros/ferrunix/actions) [![Crates.io](https://img.shields.io/crates/v/ferrunix.svg)](https://crates.io/crates/ferrunix) [![API reference](https://docs.rs/ferrunix/badge.svg)](https://docs.rs/ferrunix/) ![MSRV](https://img.shields.io/crates/msrv/ferrunix) ![License](https://img.shields.io/crates/l/ferrunix.svg)

```toml [dependencies] ferrunix = "0.3" ``` *Compiler support: requires rustc 1.67.1+* **Check out the [User Guide](https://leandros.github.io/ferrunix/user-guide/first-steps.html).** ## Documentation Due to how the various features affect the public API of the library, the documentation is provided for each major feature separately. | Feature Flags | Link to Documentation | | ------------------- | --------------------- | | `none` | [link to docs](https://leandros.github.io/ferrunix/docs-default/ferrunix/) | | `multithread` | [link to docs](https://leandros.github.io/ferrunix/docs-multithread/ferrunix/) | | `tokio` | [link to docs](https://leandros.github.io/ferrunix/docs-multithread/ferrunix/) | ## Features - Can register and inject any type (incl. generics, types must be `Send` if the `multithread` feature is enabled, and `Send + Sync` if `tokio` is enabled). - Simple and elegant Rust API; making the derive macro purely optional. - Different dependency lifetimes: - **Singleton**: Only a single instance of the object is created. - **Transient**: A new instance is created for every request. - Dependency resolution happens at run time, making it possible to dynamically register types. - Injection of concrete value types (`T`), `Box`, `Rc`, and `Arc`. - Derive macro (`#[derive(Inject)]`) to simplify registration. - Automatic registration of types, thanks to [`inventory`](https://docs.rs/inventory/latest/inventory/). - One global registry; with support for multiple sub-registries. ## Cargo Feature Flags Ferrunix has the following features to enable further functionality. Features enabled by default are marked with `*`. - `multithread`: Enables support for accessing the registry from multiple threads. This adds a bound that all registered types must be `Send`. - `derive` (`*`): Enables support for the `#[derive(Inject)]` macro. - `tokio`: Enables support for `async` constructors. Bumps the MSRV up to `1.75.0` because some of the internal traits require [RPITIT](https://blog.rust-lang.org/2023/12/21/async-fn-rpit-in-traits.html#whats-stabilizing). - `tracing`: Enables support for [tracing](https://docs.rs/tracing/latest/tracing/index.html) and annotates all public functions with [`tracing::instrument`](https://docs.rs/tracing/latest/tracing/attr.instrument.html). #### License Licensed under either of Apache License, Version 2.0 or MIT license at your option.
By contributing to this project (for example, through submitting a pull request) you agree with the individual contributor license agreement. Make sure to read and understand it.