summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_baked_icu_data/src/data/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_baked_icu_data/src/data/mod.rs')
-rw-r--r--compiler/rustc_baked_icu_data/src/data/mod.rs187
1 files changed, 105 insertions, 82 deletions
diff --git a/compiler/rustc_baked_icu_data/src/data/mod.rs b/compiler/rustc_baked_icu_data/src/data/mod.rs
index a6a71c79c..ce33339ad 100644
--- a/compiler/rustc_baked_icu_data/src/data/mod.rs
+++ b/compiler/rustc_baked_icu_data/src/data/mod.rs
@@ -1,90 +1,113 @@
// @generated
mod fallback;
mod list;
-/// This data provider was programmatically generated by [`icu_datagen`](
-/// https://unicode-org.github.io/icu4x-docs/doc/icu_datagen/enum.Out.html#variant.Module).
-#[non_exhaustive]
-pub struct BakedDataProvider;
use ::icu_provider::prelude::*;
-impl DataProvider<::icu_list::provider::AndListV1Marker> for BakedDataProvider {
- fn load(
- &self,
- req: DataRequest,
- ) -> Result<DataResponse<::icu_list::provider::AndListV1Marker>, DataError> {
- Ok(DataResponse {
- metadata: Default::default(),
- payload: Some(DataPayload::from_owned(zerofrom::ZeroFrom::zero_from(
- *list::and_v1::DATA
- .get_by(|k| req.locale.strict_cmp(k.as_bytes()).reverse())
+/// Implement [`DataProvider<M>`] on the given struct using the data
+/// hardcoded in this module. This allows the struct to be used with
+/// `icu`'s `_unstable` constructors.
+///
+/// This macro can only be called from its definition-site, i.e. right
+/// after `include!`-ing the generated module.
+///
+/// ```compile_fail
+/// struct MyDataProvider;
+/// include!("/path/to/generated/mod.rs");
+/// impl_data_provider(MyDataProvider);
+/// ```
+#[allow(unused_macros)]
+macro_rules! impl_data_provider {
+ ($ provider : path) => {
+ impl DataProvider<::icu_list::provider::AndListV1Marker> for $provider {
+ fn load(&self, req: DataRequest) -> Result<DataResponse<::icu_list::provider::AndListV1Marker>, DataError> {
+ list::and_v1::lookup(&req.locale)
+ .map(zerofrom::ZeroFrom::zero_from)
+ .map(DataPayload::from_owned)
+ .map(|payload| DataResponse { metadata: Default::default(), payload: Some(payload) })
+ .ok_or_else(|| DataErrorKind::MissingLocale.with_req(::icu_list::provider::AndListV1Marker::KEY, req))
+ }
+ }
+ impl DataProvider<::icu_provider_adapters::fallback::provider::CollationFallbackSupplementV1Marker> for $provider {
+ fn load(
+ &self,
+ req: DataRequest,
+ ) -> Result<DataResponse<::icu_provider_adapters::fallback::provider::CollationFallbackSupplementV1Marker>, DataError> {
+ fallback::supplement::co_v1::lookup(&req.locale)
+ .map(zerofrom::ZeroFrom::zero_from)
+ .map(DataPayload::from_owned)
+ .map(|payload| DataResponse { metadata: Default::default(), payload: Some(payload) })
.ok_or_else(|| {
DataErrorKind::MissingLocale
- .with_req(::icu_list::provider::AndListV1Marker::KEY, req)
- })?,
- ))),
- })
- }
-}
-impl DataProvider<::icu_provider_adapters::fallback::provider::CollationFallbackSupplementV1Marker>
- for BakedDataProvider
-{
- fn load(
- &self,
- req: DataRequest,
- ) -> Result<
- DataResponse<
- ::icu_provider_adapters::fallback::provider::CollationFallbackSupplementV1Marker,
- >,
- DataError,
- > {
- Ok(DataResponse {
- metadata: Default::default(),
- payload: Some(DataPayload::from_owned(zerofrom::ZeroFrom::zero_from(
- *fallback::supplement::co_v1::DATA.get_by(|k| req.locale.strict_cmp(k.as_bytes()).reverse()).ok_or_else(|| {
- DataErrorKind::MissingLocale.with_req(::icu_provider_adapters::fallback::provider::CollationFallbackSupplementV1Marker::KEY, req)
- })?,
- ))),
- })
- }
-}
-impl DataProvider<::icu_provider_adapters::fallback::provider::LocaleFallbackLikelySubtagsV1Marker>
- for BakedDataProvider
-{
- fn load(
- &self,
- req: DataRequest,
- ) -> Result<
- DataResponse<
- ::icu_provider_adapters::fallback::provider::LocaleFallbackLikelySubtagsV1Marker,
- >,
- DataError,
- > {
- Ok(DataResponse {
- metadata: Default::default(),
- payload: Some(DataPayload::from_owned(zerofrom::ZeroFrom::zero_from(
- *fallback::likelysubtags_v1::DATA.get_by(|k| req.locale.strict_cmp(k.as_bytes()).reverse()).ok_or_else(|| {
- DataErrorKind::MissingLocale.with_req(::icu_provider_adapters::fallback::provider::LocaleFallbackLikelySubtagsV1Marker::KEY, req)
- })?,
- ))),
- })
- }
+ .with_req(::icu_provider_adapters::fallback::provider::CollationFallbackSupplementV1Marker::KEY, req)
+ })
+ }
+ }
+ impl DataProvider<::icu_provider_adapters::fallback::provider::LocaleFallbackLikelySubtagsV1Marker> for $provider {
+ fn load(
+ &self,
+ req: DataRequest,
+ ) -> Result<DataResponse<::icu_provider_adapters::fallback::provider::LocaleFallbackLikelySubtagsV1Marker>, DataError> {
+ fallback::likelysubtags_v1::lookup(&req.locale)
+ .map(zerofrom::ZeroFrom::zero_from)
+ .map(DataPayload::from_owned)
+ .map(|payload| DataResponse { metadata: Default::default(), payload: Some(payload) })
+ .ok_or_else(|| {
+ DataErrorKind::MissingLocale
+ .with_req(::icu_provider_adapters::fallback::provider::LocaleFallbackLikelySubtagsV1Marker::KEY, req)
+ })
+ }
+ }
+ impl DataProvider<::icu_provider_adapters::fallback::provider::LocaleFallbackParentsV1Marker> for $provider {
+ fn load(
+ &self,
+ req: DataRequest,
+ ) -> Result<DataResponse<::icu_provider_adapters::fallback::provider::LocaleFallbackParentsV1Marker>, DataError> {
+ fallback::parents_v1::lookup(&req.locale)
+ .map(zerofrom::ZeroFrom::zero_from)
+ .map(DataPayload::from_owned)
+ .map(|payload| DataResponse { metadata: Default::default(), payload: Some(payload) })
+ .ok_or_else(|| {
+ DataErrorKind::MissingLocale.with_req(::icu_provider_adapters::fallback::provider::LocaleFallbackParentsV1Marker::KEY, req)
+ })
+ }
+ }
+ };
}
-impl DataProvider<::icu_provider_adapters::fallback::provider::LocaleFallbackParentsV1Marker>
- for BakedDataProvider
-{
- fn load(
- &self,
- req: DataRequest,
- ) -> Result<
- DataResponse<::icu_provider_adapters::fallback::provider::LocaleFallbackParentsV1Marker>,
- DataError,
- > {
- Ok(DataResponse {
- metadata: Default::default(),
- payload: Some(DataPayload::from_owned(zerofrom::ZeroFrom::zero_from(
- *fallback::parents_v1::DATA.get_by(|k| req.locale.strict_cmp(k.as_bytes()).reverse()).ok_or_else(|| {
- DataErrorKind::MissingLocale.with_req(::icu_provider_adapters::fallback::provider::LocaleFallbackParentsV1Marker::KEY, req)
- })?,
- ))),
- })
- }
+/// Implement [`AnyProvider`] on the given struct using the data
+/// hardcoded in this module. This allows the struct to be used with
+/// `icu`'s `_any` constructors.
+///
+/// This macro can only be called from its definition-site, i.e. right
+/// after `include!`-ing the generated module.
+///
+/// ```compile_fail
+/// struct MyAnyProvider;
+/// include!("/path/to/generated/mod.rs");
+/// impl_any_provider(MyAnyProvider);
+/// ```
+#[allow(unused_macros)]
+macro_rules! impl_any_provider {
+ ($ provider : path) => {
+ impl AnyProvider for $provider {
+ fn load_any(&self, key: DataKey, req: DataRequest) -> Result<AnyResponse, DataError> {
+ const ANDLISTV1MARKER: ::icu_provider::DataKeyHash = ::icu_list::provider::AndListV1Marker::KEY.hashed();
+ const COLLATIONFALLBACKSUPPLEMENTV1MARKER: ::icu_provider::DataKeyHash =
+ ::icu_provider_adapters::fallback::provider::CollationFallbackSupplementV1Marker::KEY.hashed();
+ const LOCALEFALLBACKLIKELYSUBTAGSV1MARKER: ::icu_provider::DataKeyHash =
+ ::icu_provider_adapters::fallback::provider::LocaleFallbackLikelySubtagsV1Marker::KEY.hashed();
+ const LOCALEFALLBACKPARENTSV1MARKER: ::icu_provider::DataKeyHash =
+ ::icu_provider_adapters::fallback::provider::LocaleFallbackParentsV1Marker::KEY.hashed();
+ match key.hashed() {
+ ANDLISTV1MARKER => list::and_v1::lookup(&req.locale).map(AnyPayload::from_static_ref),
+ COLLATIONFALLBACKSUPPLEMENTV1MARKER => fallback::supplement::co_v1::lookup(&req.locale).map(AnyPayload::from_static_ref),
+ LOCALEFALLBACKLIKELYSUBTAGSV1MARKER => fallback::likelysubtags_v1::lookup(&req.locale).map(AnyPayload::from_static_ref),
+ LOCALEFALLBACKPARENTSV1MARKER => fallback::parents_v1::lookup(&req.locale).map(AnyPayload::from_static_ref),
+ _ => return Err(DataErrorKind::MissingDataKey.with_req(key, req)),
+ }
+ .map(|payload| AnyResponse { payload: Some(payload), metadata: Default::default() })
+ .ok_or_else(|| DataErrorKind::MissingLocale.with_req(key, req))
+ }
+ }
+ };
}
+pub struct BakedDataProvider;
+impl_data_provider!(BakedDataProvider);