noema 0.4.0

Noema IOC and DI framework for Rust
Documentation
#![cfg(feature = "items_collections")]

use std::sync::Arc;

use noema::core::{Container, Injectable};
use noema::items_collections::{ItemSet, collection, item};
use noema::{items, resolve};

#[collection(i32, name = "Steps")]
struct Steps;

#[item(Steps, value = 1, name = "one")]
struct StepOne;

#[item(Steps, value = 2, name = "two")]
struct StepTwo;

items!(Steps: [StepOne, StepTwo]);

#[collection(i32, name = "Roles")]
struct Roles;

#[item(Roles, value = 10, name = "admin")]
struct Admin;

items!(Roles: [Admin]);

#[collection(i32, name = "Empty")]
struct Empty;

items!(Empty: []);

#[derive(Injectable)]
struct Workflow {
    steps: Arc<ItemSet<Steps>>,
}

#[test]
fn resolve_clone_inject_and_lookup() {
    let a = resolve::<ItemSet<Steps>>();
    let b = resolve::<ItemSet<Steps>>();
    assert!(Arc::ptr_eq(&a, &b));
    assert_eq!(a.len(), 2);
    assert!(!a.is_empty());
    assert_eq!(a[0].name(), "one");
    assert_eq!(a[1].name(), "two");
    assert_eq!(a.by_name("one").unwrap().value(), 1);
    assert_eq!(a.by_value(&2).unwrap().name(), "two");

    let wf = Workflow::inject(&Container);
    assert!(Arc::ptr_eq(&wf.steps, &a));
}

#[test]
fn empty_collection() {
    let empty = resolve::<ItemSet<Empty>>();
    assert!(empty.is_empty());
}

#[test]
fn collections_are_isolated() {
    let steps = resolve::<ItemSet<Steps>>();
    let roles = resolve::<ItemSet<Roles>>();
    assert!(steps.by_name("admin").is_none());
    assert!(roles.by_name("one").is_none());
    assert_eq!(roles.by_name("admin").unwrap().value(), 10);
}