1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/// the Config that can provide config info `T`
/// the T can be either returning Ownership or Reference
pub trait Provider<'r, T: 'r> {
    fn provide(&'r self) -> T;
}

impl<'r, T> Provider<'r, &'r T> for T {
    fn provide(&'r self) -> &'r T {
        self
    }
}

macro_rules! group_provider {
    ($($args:ident),*$(,)?) => {

        impl<'r, C,$($args),*> Provider<'r, ($($args,)*)> for C
        where
            $(
                $args: 'r,
                C: Provider<'r,$args>,
            )*
        {
            #[allow(clippy::unused_unit)]
            fn provide(&'r self) -> ($($args,)*) {
                (
                    $(
                        <C as Provider<'r,$args>>::provide(self),
                    )*
                )
            }
        }
    };
}

group_provider!();
group_provider!(T1);
group_provider!(T1, T2);
group_provider!(T1, T2, T3);
group_provider!(T1, T2, T3, T4);
group_provider!(T1, T2, T3, T4, T5);
group_provider!(T1, T2, T3, T4, T5, T6);
group_provider!(T1, T2, T3, T4, T5, T6, T7);
group_provider!(T1, T2, T3, T4, T5, T6, T7, T8);
group_provider!(T1, T2, T3, T4, T5, T6, T7, T8, T9);
group_provider!(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10);