icu_provider_adapters/
empty.rs

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//! Empty data provider implementations.
6//!
7//! Use [`EmptyDataProvider`] as a stand-in for a provider that always fails.
8
9use icu_provider::prelude::*;
10
11/// A data provider that always returns an error.
12///
13/// The returned error kind is configurable.
14///
15/// # Examples
16///
17/// ```
18/// use icu_provider::hello_world::HelloWorldV1Marker;
19/// use icu_provider::prelude::*;
20/// use icu_provider_adapters::empty::EmptyDataProvider;
21///
22/// let provider = EmptyDataProvider::new();
23///
24/// assert!(matches!(
25///     provider.load_any(HelloWorldV1Marker::KEY, Default::default()),
26///     Err(DataError {
27///         kind: DataErrorKind::MissingDataKey,
28///         ..
29///     })
30/// ));
31/// ```
32#[derive(Debug)]
33pub struct EmptyDataProvider {
34    error_kind: DataErrorKind,
35}
36
37impl Default for EmptyDataProvider {
38    fn default() -> Self {
39        Self::new()
40    }
41}
42
43impl EmptyDataProvider {
44    /// Creates a data provider that always returns [`DataErrorKind::MissingDataKey`].
45    pub fn new() -> Self {
46        Self {
47            error_kind: DataErrorKind::MissingDataKey,
48        }
49    }
50
51    /// Creates a data provider that always returns the specified error kind.
52    pub fn new_with_error_kind(error_kind: DataErrorKind) -> Self {
53        Self { error_kind }
54    }
55}
56
57impl AnyProvider for EmptyDataProvider {
58    fn load_any(&self, key: DataKey, base_req: DataRequest) -> Result<AnyResponse, DataError> {
59        Err(self.error_kind.with_req(key, base_req))
60    }
61}
62
63impl BufferProvider for EmptyDataProvider {
64    fn load_buffer(
65        &self,
66        key: DataKey,
67        base_req: DataRequest,
68    ) -> Result<DataResponse<BufferMarker>, DataError> {
69        Err(self.error_kind.with_req(key, base_req))
70    }
71}
72
73impl<M> DynamicDataProvider<M> for EmptyDataProvider
74where
75    M: DataMarker,
76{
77    fn load_data(&self, key: DataKey, base_req: DataRequest) -> Result<DataResponse<M>, DataError> {
78        Err(self.error_kind.with_req(key, base_req))
79    }
80}
81
82impl<M> DataProvider<M> for EmptyDataProvider
83where
84    M: KeyedDataMarker,
85{
86    fn load(&self, base_req: DataRequest) -> Result<DataResponse<M>, DataError> {
87        Err(self.error_kind.with_req(M::KEY, base_req))
88    }
89}
90
91#[cfg(feature = "datagen")]
92impl<M> icu_provider::datagen::IterableDataProvider<M> for EmptyDataProvider
93where
94    M: KeyedDataMarker,
95{
96    fn supported_locales(&self) -> Result<alloc::vec::Vec<DataLocale>, DataError> {
97        Ok(vec![])
98    }
99}
100
101#[cfg(feature = "datagen")]
102impl<M> icu_provider::datagen::IterableDynamicDataProvider<M> for EmptyDataProvider
103where
104    M: DataMarker,
105{
106    fn supported_locales_for_key(
107        &self,
108        _: DataKey,
109    ) -> Result<alloc::vec::Vec<DataLocale>, DataError> {
110        Ok(vec![])
111    }
112}