# kizuna [![CI-badge]](ci) [![Latest Version]][crates.io] [![Docs][docs-badge]][docs-link] [CI-badge]: https://github.com/Neo-Ciber94/kizuna/actions/workflows/ci.yml/badge.svg [ci]: https://github.com/Neo-Ciber94/kizuna/actions/workflows/ci.yml [latest version]: https://img.shields.io/crates/v/kizuna.svg [crates.io]: https://crates.io/crates/kizuna [docs-badge]: https://img.shields.io/badge/docs-kizuna-blue.svg [docs-link]: https://docs.rs/kizuna/latest 🔍 A simple service locator for Rust. This library provides a simple service locator for Rust programs. It allows for easy insertion and retrieval of values by type, and supports both single instance values and values created by factory functions. ## Add to your project ```bash cargo add kizuna ``` or in your `Cargo.toml` ```toml kizuna = "0.1.0" ``` ## Usage ```rust use kizuna::Locator; #[derive(Debug, Clone, PartialEq)] struct Name(&'static str); #[derive(Debug)] struct Person(Name); fn greet(person: Person) { println!("Hello {:?}", person.0); } fn main() { let mut locator = Locator::new(); // Register the dependencies locator.insert(Name("Athena")); locator.insert_with(|locator| Person(locator.get::().unwrap())); let person = locator.get::().unwrap(); assert_eq!(person.0, Name("Athena")); // You can call a function injecting the dependencies locator.invoke(greet).unwrap(); } ``` ## Support for `async/await` ```rust use kizuna::Locator; async fn hello(greet: String) -> usize { println!("{greet}"); greet.len() } #[tokio::main] async fn main() { let mut locator = Locator::new(); locator.insert(String::from("hello world")); let result = locator.invoke_async(hello).await.unwrap(); assert_eq!(result, 11); } ``` ## Test Run tests with `cargo test --lib` ## License This project is licensed under the MIT License