// This file is part of ICU4X. For terms of use, please see the file // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). //! Helpers for switching between multiple providers. use alloc::collections::BTreeSet; #[cfg(feature = "export")] use icu_provider::export::ExportableProvider; use icu_provider::prelude::*; /// A provider that is one of two types determined at runtime. /// /// Data provider traits implemented by both `P0` and `P1` are implemented on /// `EitherProvider`. #[allow(clippy::exhaustive_enums)] // this is stable #[derive(Debug)] pub enum EitherProvider { /// A value of type `P0`. A(P0), /// A value of type `P1`. B(P1), } impl, P1: DynamicDataProvider> DynamicDataProvider for EitherProvider { #[inline] fn load_data( &self, marker: DataMarkerInfo, req: DataRequest, ) -> Result, DataError> { use EitherProvider::*; match self { A(p) => p.load_data(marker, req), B(p) => p.load_data(marker, req), } } } impl, P1: DynamicDryDataProvider> DynamicDryDataProvider for EitherProvider { #[inline] fn dry_load_data( &self, marker: DataMarkerInfo, req: DataRequest, ) -> Result { use EitherProvider::*; match self { A(p) => p.dry_load_data(marker, req), B(p) => p.dry_load_data(marker, req), } } } impl, P1: DataProvider> DataProvider for EitherProvider { #[inline] fn load(&self, req: DataRequest) -> Result, DataError> { use EitherProvider::*; match self { A(p) => p.load(req), B(p) => p.load(req), } } } impl, P1: DryDataProvider> DryDataProvider for EitherProvider { #[inline] fn dry_load(&self, req: DataRequest) -> Result { use EitherProvider::*; match self { A(p) => p.dry_load(req), B(p) => p.dry_load(req), } } } impl< M: DynamicDataMarker, P0: IterableDynamicDataProvider, P1: IterableDynamicDataProvider, > IterableDynamicDataProvider for EitherProvider { #[inline] fn iter_ids_for_marker( &self, marker: DataMarkerInfo, ) -> Result, DataError> { use EitherProvider::*; match self { A(p) => p.iter_ids_for_marker(marker), B(p) => p.iter_ids_for_marker(marker), } } } impl, P1: IterableDataProvider> IterableDataProvider for EitherProvider { #[inline] fn iter_ids(&self) -> Result, DataError> { use EitherProvider::*; match self { A(p) => p.iter_ids(), B(p) => p.iter_ids(), } } } #[cfg(feature = "export")] impl ExportableProvider for EitherProvider where P0: ExportableProvider, P1: ExportableProvider, { fn supported_markers(&self) -> alloc::collections::BTreeSet { use EitherProvider::*; match self { A(p) => p.supported_markers(), B(p) => p.supported_markers(), } } }