kizuna 0.1.0

A simple service locator
Documentation
# 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::<Name>().unwrap()));

    let person = locator.get::<Person>().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