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 ).
5 //! Helpers for switching between multiple providers.
7 use icu_provider
::prelude
::*;
9 #[cfg(feature = "datagen")]
10 use icu_provider
::datagen
;
12 /// A provider that is one of two types determined at runtime.
14 /// Data provider traits implemented by both `P0` and `P1` are implemented on
15 /// `EitherProvider<P0, P1>`.
16 #[allow(clippy::exhaustive_enums)] // this is stable
17 pub enum EitherProvider
<P0
, P1
> {
18 /// A value of type `P0`.
20 /// A value of type `P1`.
24 impl<P0
: AnyProvider
, P1
: AnyProvider
> AnyProvider
for EitherProvider
<P0
, P1
> {
26 fn load_any(&self, key
: DataKey
, req
: DataRequest
) -> Result
<AnyResponse
, DataError
> {
27 use EitherProvider
::*;
29 A(p
) => p
.load_any(key
, req
),
30 B(p
) => p
.load_any(key
, req
),
35 impl<P0
: BufferProvider
, P1
: BufferProvider
> BufferProvider
for EitherProvider
<P0
, P1
> {
41 ) -> Result
<DataResponse
<BufferMarker
>, DataError
> {
42 use EitherProvider
::*;
44 A(p
) => p
.load_buffer(key
, req
),
45 B(p
) => p
.load_buffer(key
, req
),
50 impl<M
: DataMarker
, P0
: DynamicDataProvider
<M
>, P1
: DynamicDataProvider
<M
>> DynamicDataProvider
<M
>
51 for EitherProvider
<P0
, P1
>
54 fn load_data(&self, key
: DataKey
, req
: DataRequest
) -> Result
<DataResponse
<M
>, DataError
> {
55 use EitherProvider
::*;
57 A(p
) => p
.load_data(key
, req
),
58 B(p
) => p
.load_data(key
, req
),
63 impl<M
: KeyedDataMarker
, P0
: DataProvider
<M
>, P1
: DataProvider
<M
>> DataProvider
<M
>
64 for EitherProvider
<P0
, P1
>
67 fn load(&self, req
: DataRequest
) -> Result
<DataResponse
<M
>, DataError
> {
68 use EitherProvider
::*;
76 #[cfg(feature = "datagen")]
79 P0
: datagen
::IterableDynamicDataProvider
<M
>,
80 P1
: datagen
::IterableDynamicDataProvider
<M
>,
81 > datagen
::IterableDynamicDataProvider
<M
> for EitherProvider
<P0
, P1
>
84 fn supported_locales_for_key(
87 ) -> Result
<alloc
::vec
::Vec
<DataLocale
>, DataError
> {
88 use EitherProvider
::*;
90 A(p
) => p
.supported_locales_for_key(key
),
91 B(p
) => p
.supported_locales_for_key(key
),
96 #[cfg(feature = "datagen")]
99 P0
: datagen
::IterableDataProvider
<M
>,
100 P1
: datagen
::IterableDataProvider
<M
>,
101 > datagen
::IterableDataProvider
<M
> for EitherProvider
<P0
, P1
>
104 fn supported_locales(&self) -> Result
<alloc
::vec
::Vec
<DataLocale
>, DataError
> {
105 use EitherProvider
::*;
107 A(p
) => p
.supported_locales(),
108 B(p
) => p
.supported_locales(),