forgy 0.1.0

Derive macro for building dependency graphs.
Documentation
#![expect(unused)]

use std::sync::Arc;

use forgy::Build;

#[test]
fn derives_on_unit() {
    #[derive(Build)]
    struct Unit;

    let mut c = forgy::Container::new(());

    let _: Arc<Unit> = c.get();
}

#[test]
fn derives_on_tuple() {
    #[derive(Build)]
    struct Unit;

    #[derive(Build)]
    struct Tuple(Arc<Unit>);

    let mut c = forgy::Container::new(());

    let _: Arc<Tuple> = c.get();
}

#[test]
fn derives_on_struct() {
    #[derive(Build)]
    struct Unit;

    #[derive(Build)]
    struct Struct {
        unit: Arc<Unit>,
    }

    let mut c = forgy::Container::new(());

    let _: Arc<Struct> = c.get();
}

#[test]
fn derives_with_input() {
    struct Input {
        string: String,
    }

    #[derive(Build)]
    #[forgy(input = Input)]
    struct Struct {
        #[forgy(value = input.string.clone())]
        from_input: String,
    }

    let mut c = forgy::Container::new(Input {
        string: "some string".to_string(),
    });

    let s: Arc<Struct> = c.get();
    assert_eq!(s.from_input, "some string");
}

#[test]
fn derives_with_input_and_ambivalend() {
    struct Input {
        string: String,
    }

    #[derive(Build)]
    #[forgy(input = Input)]
    struct Struct {
        #[forgy(value = input.string.clone())]
        from_input: String,
        dep: Arc<Dep>,
    }

    #[derive(Build)]
    struct Dep;

    let mut c = forgy::Container::new(Input {
        string: "some string".to_string(),
    });

    let s: Arc<Struct> = c.get();
    assert_eq!(s.from_input, "some string");
}

#[test]
fn constructs_default_values() {
    #[derive(Build)]
    struct Struct {
        #[forgy(value = Default::default())]
        some_cache: std::collections::HashSet<String>,
    }

    let mut c = forgy::Container::new(());

    let _: Arc<Struct> = c.get();
}

#[test]
fn constructs_with_value() {
    #[derive(Build)]
    struct Struct {
        #[forgy(value = 16)]
        max_tasks: u32,
    }

    let mut c = forgy::Container::new(());

    let s: Arc<Struct> = c.get();
    assert_eq!(s.max_tasks, 16);
}