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 validation() {
    #[derive(Deftly, Debug)]
    #[derive_deftly(Builder)]
    #[deftly(builder(build_fn(validate = "OddBuilder::validate")))]
    struct Odd {
        num: u32,
    }
    impl OddBuilder {
        fn validate(&self) -> std::result::Result<(), String> {
            match self.num {
                Some(n) if n & 1 == 0 => Err(format!("{} isn't odd", n)),
                _ => Ok(()),
            }
        }
    }

    let odd = OddBuilder::new().num(7).build().unwrap();
    assert_eq!(odd.num, 7);

    let even = OddBuilder::new().num(8).build();
    assert_matches!(
        even.err().unwrap(),
        OddBuilderError::ValidationError(s) if s == "8 isn't odd"
    );

    let absent = OddBuilder::new().build();
    assert_matches!(
        absent.err().unwrap(),
        OddBuilderError::UninitializedField(_)
    );
}