build-deftly 0.1.0

Derive custom builders, using the derive-deftly macro system
Documentation
use assert_matches::assert_matches;
use build_deftly::prelude::*;
use derive_deftly::Deftly;

#[test]
fn skip_setters_outer() {
    #[derive(Deftly, Debug)]
    #[derive_deftly(Builder)]
    #[deftly(builder(setter(skip)))]
    struct Small {
        hello: String,
        world: u32,
    }

    let small = Small::builder().build().unwrap();
    assert_eq!(&small.hello, "");
    assert_eq!(small.world, 0);
}

#[test]
fn skip_setters_inner() {
    #[derive(Deftly, Debug)]
    #[derive_deftly(Builder)]
    struct Small {
        hello: String,
        #[deftly(builder(setter(skip)))]
        world: u32,
    }

    let small = Small::builder().hello("hi".to_string()).build().unwrap();
    assert_eq!(&small.hello, "hi");
    assert_eq!(small.world, 0);

    assert_matches!(
        Small::builder().build(),
        Err(SmallBuilderError::UninitializedField(_))
    );
}

#[test]
fn skip_setters_dflt() {
    #[derive(Deftly, Debug)]
    #[derive_deftly(Builder)]
    #[deftly(builder(setter(skip)))]
    struct Small {
        #[deftly(builder(setter(enabled)))]
        hello: String,
        world: u32,
    }

    let small = Small::builder().hello("hi".to_string()).build().unwrap();
    assert_eq!(&small.hello, "hi");
    assert_eq!(small.world, 0);

    assert_matches!(
        Small::builder().build(),
        Err(SmallBuilderError::UninitializedField(_))
    );
}

#[test]
fn custom_setters_outer() {
    #[derive(Deftly, Debug)]
    #[derive_deftly(Builder)]
    #[deftly(builder(setter(custom)))]
    struct Small {
        hello: String,
        world: u32,
    }
    impl SmallBuilder {
        fn set_hello(&mut self, s: &str) -> &mut Self {
            self.hello = Some(s.to_string());
            self
        }
        fn make_world_square_of(&mut self, n: u32) -> &mut Self {
            self.world = Some(n * n);
            self
        }
    }

    let small = Small::builder()
        .set_hello("hi")
        .make_world_square_of(11)
        .build()
        .unwrap();
    assert_eq!(&small.hello, "hi");
    assert_eq!(small.world, 121);
}

#[test]
fn custom_setters_inner() {
    #[derive(Deftly, Debug)]
    #[derive_deftly(Builder)]
    struct Small {
        #[deftly(builder(setter(custom)))]
        hello: String,
        #[deftly(builder(setter(custom)))]
        world: u32,
    }
    impl SmallBuilder {
        fn set_hello(&mut self, s: &str) -> &mut Self {
            self.hello = Some(s.to_string());
            self
        }
        fn make_world_square_of(&mut self, n: u32) -> &mut Self {
            self.world = Some(n * n);
            self
        }
    }

    let small = Small::builder()
        .set_hello("hi")
        .make_world_square_of(11)
        .build()
        .unwrap();
    assert_eq!(&small.hello, "hi");
    assert_eq!(small.world, 121);
}

#[test]
fn skip_build() {
    #[derive(Deftly, Debug)]
    #[derive_deftly(Builder)]
    #[deftly(builder(build_fn(skip)))]
    struct Small {
        hello: String,
        world: u32,
    }
    impl SmallBuilder {
        fn build(&self) -> Small {
            Small {
                hello: "ignored".into(),
                world: 42,
            }
        }
    }

    let small = Small::builder().hello("abc".to_string()).world(99).build();
    assert_eq!(&small.hello, "ignored");
    assert_eq!(small.world, 42);
}