bauer 0.5.0

A derive macro for automatically generating builders
Documentation
#![allow(dead_code)]

fn sum(iter: impl Iterator<Item = u32>) -> u32 {
    iter.sum()
}

fn add_2(iter: impl Iterator<Item = u32>) -> Vec<u32> {
    iter.map(|n| n + 2).collect()
}

macro_rules! tests {
    ($kind: literal in mod $module: ident $($unwrap: ident)?) => {
        mod $module {
            use bauer::Builder;

            #[derive(Debug, Builder, PartialEq)]
            #[builder(kind = $kind)]
            struct Complex {
                required: u32,
                optional: Option<u32>,
                #[builder(default)]
                default: u32,
                #[builder(default = "42")]
                default_value: u32,
                #[builder(repeat)]
                repeat: Vec<u32>,
                #[builder(repeat = char)]
                repeat_ty: String,
                #[builder(repeat, repeat_n = 3)]
                repeat_n_exact: Vec<u32>,
                #[builder(repeat, repeat_n = 3..)]
                repeat_n_at_least: Vec<u32>,
                #[builder(repeat, repeat_n = ..5)]
                repeat_n_at_most: Vec<u32>,
                #[builder(repeat, repeat_n = 2..5)]
                repeat_n_range_ex: Vec<u32>,
                #[builder(repeat, repeat_n = 2..=5)]
                repeat_n_range_in: Vec<u32>,
                #[builder(repeat, collector = super::add_2)]
                collector_map: Vec<u32>,
                #[builder(repeat = u32, collector = super::sum)]
                collector_sum: u32,
                #[builder(into)]
                into: String,
                #[builder(into, repeat)]
                into_repeat: Vec<String>,
                #[builder(tuple)]
                tuple: (u32, u32),
                #[builder(tuple, into)]
                tuple_into: (String, String),
                #[builder(repeat, tuple)]
                tuple_repeat: Vec<(u32, u32)>,
                #[builder(repeat, tuple, into)]
                tuple_repeat_into: Vec<(String, String)>,
                #[builder(rename = "renamed")]
                not_renamed: u32,
            }

            #[test]
            fn minimal() {
                let c: Complex = Complex::builder()
                    .required(69)
                    .repeat_n_exact(1)
                    .repeat_n_exact(2)
                    .repeat_n_exact(3)
                    .repeat_n_at_least(1)
                    .repeat_n_at_least(2)
                    .repeat_n_at_least(3)
                    .repeat_n_range_ex(1)
                    .repeat_n_range_ex(2)
                    .repeat_n_range_in(1)
                    .repeat_n_range_in(2)
                    .into("into")
                    .tuple(8, 9)
                    .tuple_into("a", "b")
                    .renamed(4)
                    .build()
                    $(.$unwrap())?;

                assert_eq!(c.required, 69);
                assert_eq!(c.optional, None);
                assert_eq!(c.default, 0);
                assert_eq!(c.default_value, 42);
                assert_eq!(c.repeat, []);
                assert_eq!(c.repeat_ty, "");
                assert_eq!(c.repeat_n_exact, [1, 2, 3]);
                assert_eq!(c.repeat_n_at_least, [1, 2, 3]);
                assert_eq!(c.repeat_n_at_most, []);
                assert_eq!(c.repeat_n_range_ex, [1, 2]);
                assert_eq!(c.repeat_n_range_in, [1, 2]);
                assert_eq!(c.collector_map, []);
                assert_eq!(c.collector_sum, 0);
                assert_eq!(c.into, "into");
                assert_eq!(c.into_repeat, <[&str; 0]>::default());
                assert_eq!(c.tuple, (8, 9));
                assert_eq!(c.tuple_into, ("a".to_string(), "b".to_string()));
                assert_eq!(c.tuple_repeat, []);
                assert_eq!(c.tuple_repeat_into, []);
                assert_eq!(c.not_renamed, 4);
            }

            #[test]
            fn full() {
                let c: Complex = Complex::builder()
                    .required(69)
                    .optional(8675309)
                    .default(42)
                    .default_value(1337)
                    .repeat(1)
                    .repeat(2)
                    .repeat_ty('h')
                    .repeat_ty('i')
                    .repeat_n_exact(1)
                    .repeat_n_exact(2)
                    .repeat_n_exact(3)
                    .repeat_n_at_least(1)
                    .repeat_n_at_least(2)
                    .repeat_n_at_least(3)
                    .repeat_n_at_most(1)
                    .repeat_n_at_most(2)
                    .repeat_n_at_most(3)
                    .repeat_n_range_ex(1)
                    .repeat_n_range_ex(2)
                    .repeat_n_range_in(1)
                    .repeat_n_range_in(2)
                    .collector_map(1)
                    .collector_map(2)
                    .collector_map(3)
                    .collector_sum(1)
                    .collector_sum(2)
                    .collector_sum(3)
                    .into("into")
                    .into_repeat("a")
                    .into_repeat("b")
                    .into_repeat("c")
                    .tuple(8, 9)
                    .tuple_into("a", "b")
                    .tuple_repeat(1, 2)
                    .tuple_repeat(3, 4)
                    .tuple_repeat_into("a", "b")
                    .tuple_repeat_into("c", "d")
                    .renamed(4)
                    .build()
                    $(.$unwrap())?;

                assert_eq!(c.required, 69);
                assert_eq!(c.optional, Some(8675309));
                assert_eq!(c.default, 42);
                assert_eq!(c.default_value, 1337);
                assert_eq!(c.repeat, [1, 2]);
                assert_eq!(c.repeat_ty, "hi");
                assert_eq!(c.repeat_n_exact, [1, 2, 3]);
                assert_eq!(c.repeat_n_at_least, [1, 2, 3]);
                assert_eq!(c.repeat_n_at_most, [1, 2, 3]);
                assert_eq!(c.repeat_n_range_ex, [1, 2]);
                assert_eq!(c.repeat_n_range_in, [1, 2]);
                assert_eq!(c.collector_map, [3, 4, 5]);
                assert_eq!(c.collector_sum, 1 + 2 + 3);
                assert_eq!(c.into, "into");
                assert_eq!(c.into_repeat, ["a", "b", "c"]);
                assert_eq!(c.tuple, (8, 9));
                assert_eq!(c.tuple_into, ("a".to_string(), "b".to_string()));
                assert_eq!(c.tuple_repeat, [(1, 2), (3, 4)]);
                assert_eq!(c.tuple_repeat_into, [
                    ("a".to_string(), "b".to_string()),
                    ("c".to_string(), "d".to_string())
                ]);
                assert_eq!(c.not_renamed, 4);
            }
        }
    };
}

tests!("borrowed" in mod borrowed unwrap);
tests!("owned" in mod owned unwrap);
tests!("type-state" in mod type_state);