rocket-dependency-injection 0.1.0

Small experimental crate for adding dependency injection functionalities to rocket
Documentation
use rocket_dependency_injection::derive::{resolve_constructor, Resolve};
use rocket_dependency_injection::{RocketExtension, ServiceProvider};

#[tokio::test]
async fn test_add_with() {
    #[derive(Clone)]
    struct A;
    #[derive(Clone)]
    struct B(A);

    let rocket = rocket::build()
        .add_with(|provider| B(provider.unwrap()))
        .add_with(|_| A)
        .ignite()
        .await
        .unwrap();

    assert!(rocket.state::<B>().is_some());
}

#[tokio::test]
async fn test_add() {
    #[derive(Clone)]
    struct A;
    #[derive(Clone)]
    struct B(A);

    impl rocket_dependency_injection::Resolve for A {
        fn resolve(_ : &ServiceProvider) -> Self {
            Self
        }
    }

    impl rocket_dependency_injection::Resolve for B {
        fn resolve(service_provider : &ServiceProvider) -> Self {
            Self(service_provider.unwrap())
        }
    }

    let rocket = rocket::build()
        .add::<B>()
        .add::<A>()
        .ignite()
        .await
        .unwrap();

    assert!(rocket.state::<B>().is_some());
}

#[tokio::test]
async fn test_add_derive() {
    #[derive(Clone, Resolve)]
    struct A;
    #[derive(Clone, Resolve)]
    struct B(A);

    impl A {
        #[resolve_constructor]
        fn new() -> Self {
            Self
        }
    }

    impl B {
        #[resolve_constructor]
        fn new(a: A) -> Self {
            Self(a)
        }
    }

    let rocket = rocket::build()
        .add::<B>()
        .add::<A>()
        .ignite()
        .await
        .unwrap();

    assert!(rocket.state::<B>().is_some());
}