1// This file is part of ICU4X. For terms of use, please see the file
2// called LICENSE at the top level of the ICU4X source tree
3// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
4
5/// Make a forking data provider with an arbitrary number of inner providers
6/// that are known at build time.
7///
8/// # Examples
9///
10/// ```
11/// use icu_provider_adapters::fork::ForkByKeyProvider;
12///
13/// // Some empty example providers:
14/// #[derive(PartialEq, Debug)]
15/// struct Provider1;
16/// #[derive(PartialEq, Debug)]
17/// struct Provider2;
18/// #[derive(PartialEq, Debug)]
19/// struct Provider3;
20///
21/// // Combine them into one:
22/// let forking1 = icu_provider_adapters::make_forking_provider!(
23/// ForkByKeyProvider::new,
24/// [Provider1, Provider2, Provider3,]
25/// );
26///
27/// // This is equivalent to:
28/// let forking2 = ForkByKeyProvider::new(
29/// Provider1,
30/// ForkByKeyProvider::new(Provider2, Provider3),
31/// );
32///
33/// assert_eq!(forking1, forking2);
34/// ```
35#[macro_export]
36macro_rules! make_forking_provider {
37 // Base case:
38 ($combo_p:path, [ $a:expr, $b:expr, ]) => {
39 $combo_p($a, $b)
40 };
41 // General list:
42 ($combo_p:path, [ $a:expr, $b:expr, $($c:expr),+, ]) => {
43 $combo_p($a, $crate::make_forking_provider!($combo_p, [ $b, $($c),+, ]))
44 };
45}
46
47#[cfg(test)]
48mod test {
49 struct Provider1;
50 struct Provider2;
51 struct Provider3;
52
53 #[test]
54 fn test_make_forking_provider() {
55 make_forking_provider!(
56 crate::fork::ForkByKeyProvider::new,
57 [Provider1, Provider2, Provider3,]
58 );
59 }
60}
61