infallible_builder/
lib.rs

1//pub use infallible_builder_macro::Builder;
2pub use infallible_builder_macro::Builder;
3
4#[cfg(test)]
5mod tests {
6    use super::*;
7    use smart_default::SmartDefault;
8
9    #[derive(Default)]
10    #[Builder]
11    struct Person {
12        name: String,
13        age: i64,
14        birthday: Option<String>,
15    }
16
17    #[test]
18    fn builder_sets_fields_correctly() {
19        let person = Person::builder()
20            .name("Alice")
21            .age(30)
22            .build();
23        assert_eq!(person.name, "Alice");
24        assert_eq!(person.age, 30);
25    }
26
27    #[test]
28    fn builder_is_owned() {
29        let mut person_builder = Person::builder();
30        person_builder = person_builder.name("Bob");
31        person_builder = person_builder.age(25);
32        let person = person_builder.build();
33        assert_eq!(person.name, "Bob");
34        assert_eq!(person.age, 25);
35    }
36
37    #[test]
38    fn builder_uses_defaults() {
39        let person = Person::builder().build();
40        assert_eq!(person.name, "");
41        assert_eq!(person.age, 0);
42        assert_eq!(person.birthday, None);
43    }
44
45    #[test]
46    fn builder_strips_option() {
47        // The builder should accept the inner type for Option fields
48        let person = Person::builder()
49            .birthday("2000-01-01")
50            .build();
51        assert_eq!(person.birthday, Some("2000-01-01".to_string()));
52    }
53
54    #[test]
55    fn builder_works_with_smart_default() {
56        //#[derive(SmartDefault, Builder)]
57        #[derive(PartialEq, SmartDefault)]
58        #[Builder]
59        struct Animal {
60            #[default(Species::Dog)]
61            pub species: Species,
62        }
63
64        // Non-Default type
65        #[derive(Debug, PartialEq)]
66        #[allow(dead_code)]
67        enum Species {
68            Dog,
69            Cat,
70        }
71
72        let animal = Animal::builder().build();
73        assert_eq!(animal.species, Species::Dog);
74    }
75}