main
 1pub fn build<T: Default>() -> T {
 2    T::default()
 3}
 4
 5pub fn build_with<T, F>(initializer: F) -> T
 6where
 7    T: Default,
 8    F: std::ops::FnOnce(&mut T),
 9{
10    let mut item = build::<T>();
11    initializer(&mut item);
12    item
13}
14
15#[cfg(test)]
16mod tests {
17    use super::*;
18
19    #[derive(Default)]
20    struct Person {
21        name: String,
22        age: i32,
23    }
24
25    #[test]
26    fn build_test_it_builds_a_new_instance_with_default_values() {
27        let item = build::<Person>();
28
29        assert_eq!(item.name, "");
30        assert_eq!(item.age, 0);
31    }
32
33    #[test]
34    fn build_with_test_initializes_the_new_instance() {
35        let item = build_with(|item: &mut Person| {
36            item.name = String::from("pidge");
37            item.age = 42;
38        });
39
40        assert_eq!(item.name, "pidge");
41        assert_eq!(item.age, 42);
42    }
43}