dfdi 0.2.0

Dependency For Dependency Injection
Documentation
use dfdi::{Cached, CachedService, Context, Service};

#[derive(Debug, Clone, Service)]
struct Credentials {
    username: String,
    password: String,
}

#[derive(Debug, Service)]
#[service(() -> Result<Self, UserError>)]
struct User<'a> {
    #[allow(unused)]
    username: &'a str,
}

#[derive(Debug, thiserror::Error)]
enum UserError {
    #[error("invalid authorization token")]
    InvalidAuth,
}

fn main() {
    let mut cx = Context::new();

    let credentials = Credentials {
        username: "admin".to_string(),
        password: "admin".to_string(),
    };

    cx.bind_with::<&Credentials>(CachedService(credentials));

    cx.bind_with::<&User>(Cached::new_fn(|cx, _arg| {
        let token = cx.resolve::<&Credentials>();
        match (&*token.username, &*token.password) {
            (username @ "admin", "admin") => Ok(User { username }),
            _ => Err(UserError::InvalidAuth),
        }
    }));

    println!("AuthToken: {:?}", cx.resolve::<&Credentials>());
    println!("User: {:?}", cx.resolve::<&User>().as_ref().unwrap());
}