diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /third_party/rust/icu_provider/src/lib.rs | |
parent | Initial commit. (diff) | |
download | firefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz firefox-26a029d407be480d791972afb5975cf62c9360a6.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/icu_provider/src/lib.rs')
-rw-r--r-- | third_party/rust/icu_provider/src/lib.rs | 267 |
1 files changed, 267 insertions, 0 deletions
diff --git a/third_party/rust/icu_provider/src/lib.rs b/third_party/rust/icu_provider/src/lib.rs new file mode 100644 index 0000000000..01cb2a3b34 --- /dev/null +++ b/third_party/rust/icu_provider/src/lib.rs @@ -0,0 +1,267 @@ +// 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 ). + +//! `icu_provider` is one of the [`ICU4X`] components. +//! +//! Unicode's experience with ICU4X's parent projects, ICU4C and ICU4J, led the team to realize +//! that data management is the most critical aspect of deploying internationalization, and that it requires +//! a high level of customization for the needs of the platform it is embedded in. As a result +//! ICU4X comes with a selection of providers that should allow for ICU4X to naturally fit into +//! different business and technological needs of customers. +//! +//! `icu_provider` defines traits and structs for transmitting data through the ICU4X locale +//! data pipeline. The primary trait is [`DataProvider`]. It is parameterized by a +//! [`KeyedDataMarker`], which contains the data type and a [`DataKey`]. It has one method, +//! [`DataProvider::load`], which transforms a [`DataRequest`] +//! into a [`DataResponse`]. +//! +//! - [`DataKey`] is a fixed identifier for the data type, such as `"plurals/cardinal@1"`. +//! - [`DataRequest`] contains additional annotations to choose a specific variant of the key, +//! such as a locale. +//! - [`DataResponse`] contains the data if the request was successful. +//! +//! In addition, there are three other traits which are widely implemented: +//! +//! - [`AnyProvider`] returns data as `dyn Any` trait objects. +//! - [`BufferProvider`] returns data as `[u8]` buffers. +//! - [`DynamicDataProvider`] returns structured data but is not specific to a key. +//! +//! The most common types required for this crate are included via the prelude: +//! +//! ``` +//! use icu_provider::prelude::*; +//! ``` +//! +//! ## Types of Data Providers +//! +//! All nontrivial data providers can fit into one of two classes. +//! +//! 1. [`AnyProvider`]: Those whose data originates as structured Rust objects +//! 2. [`BufferProvider`]: Those whose data originates as unstructured `[u8]` buffers +//! +//! **✨ Key Insight:** A given data provider is generally *either* an [`AnyProvider`] *or* a +//! [`BufferProvider`]. Which type depends on the data source, and it is not generally possible +//! to convert one to the other. +//! +//! See also [crate::constructors]. +//! +//! ### AnyProvider +//! +//! These providers are able to return structured data cast into `dyn Any` trait objects. Users +//! can call [`as_downcasting()`] to get an object implementing [`DataProvider`] by downcasting +//! the trait objects. +//! +//! Examples of AnyProviders: +//! +//! - [`DatagenProvider`] reads structured data from CLDR source files and returns ICU4X data structs. +//! - [`AnyPayloadProvider`] wraps a specific data struct and returns it. +//! - The `BakedDataProvider` which encodes structured data directly in Rust source +//! +//! ### BufferProvider +//! +//! These providers are able to return unstructured data typically represented as +//! [`serde`]-serialized buffers. Users can call [`as_deserializing()`] to get an object +//! implementing [`DataProvider`] by invoking Serde Deserialize. +//! +//! Examples of BufferProviders: +//! +//! - [`FsDataProvider`] reads individual buffers from the filesystem. +//! - [`BlobDataProvider`] reads buffers from a large in-memory blob. +//! +//! ## Provider Adapters +//! +//! ICU4X offers several built-in modules to combine providers in interesting ways. +//! These can be found in the [`icu_provider_adapters`] crate. +//! +//! ## Testing Provider +//! +//! This crate also contains a concrete provider for demonstration purposes: +//! +//! - [`HelloWorldProvider`] returns "hello world" strings in several languages. +//! +//! ## Types and Lifetimes +//! +//! Types compatible with [`Yokeable`] can be passed through the data provider, so long as they are +//! associated with a marker type implementing [`DataMarker`]. +//! +//! Data structs should generally have one lifetime argument: `'data`. This lifetime allows data +//! structs to borrow zero-copy data. +//! +//! ## Data generation API +//! +//! *This functionality is enabled with the "datagen" Cargo feature* +//! +//! The [`datagen`] module contains several APIs for data generation. See [`icu_datagen`] for the reference +//! data generation implementation. +//! +//! [`ICU4X`]: ../icu/index.html +//! [`DataProvider`]: data_provider::DataProvider +//! [`DataKey`]: key::DataKey +//! [`DataLocale`]: request::DataLocale +//! [`IterableDynamicDataProvider`]: datagen::IterableDynamicDataProvider +//! [`IterableDataProvider`]: datagen::IterableDataProvider +//! [`AnyPayloadProvider`]: ../icu_provider_adapters/any_payload/struct.AnyPayloadProvider.html +//! [`HelloWorldProvider`]: hello_world::HelloWorldProvider +//! [`AnyProvider`]: any::AnyProvider +//! [`Yokeable`]: yoke::Yokeable +//! [`impl_dynamic_data_provider!`]: impl_dynamic_data_provider +//! [`icu_provider_adapters`]: ../icu_provider_adapters/index.html +//! [`DatagenProvider`]: ../icu_datagen/struct.DatagenProvider.html +//! [`as_downcasting()`]: AsDowncastingAnyProvider::as_downcasting +//! [`as_deserializing()`]: AsDeserializingBufferProvider::as_deserializing +//! [`CldrJsonDataProvider`]: ../icu_datagen/cldr/struct.CldrJsonDataProvider.html +//! [`FsDataProvider`]: ../icu_provider_fs/struct.FsDataProvider.html +//! [`BlobDataProvider`]: ../icu_provider_blob/struct.BlobDataProvider.html +//! [`icu_datagen`]: ../icu_datagen/index.html + +// https://github.com/unicode-org/icu4x/blob/main/docs/process/boilerplate.md#library-annotations +#![cfg_attr(not(any(test, feature = "std")), no_std)] +#![cfg_attr( + not(test), + deny( + clippy::indexing_slicing, + clippy::unwrap_used, + clippy::expect_used, + clippy::panic, + clippy::exhaustive_structs, + clippy::exhaustive_enums, + missing_debug_implementations, + ) +)] +#![warn(missing_docs)] + +extern crate alloc; + +mod data_provider; +mod error; +#[doc(hidden)] +pub mod fallback; +mod key; +mod request; +mod response; + +pub mod any; +pub mod buf; +pub mod constructors; +#[cfg(feature = "datagen")] +pub mod datagen; +pub mod dynutil; +pub mod hello_world; +pub mod marker; +#[cfg(feature = "serde")] +pub mod serde; + +// Types from private modules +pub use crate::data_provider::DataProvider; +pub use crate::data_provider::DynamicDataProvider; +pub use crate::error::DataError; +pub use crate::error::DataErrorKind; +pub use crate::key::DataKey; +pub use crate::key::DataKeyHash; +pub use crate::key::DataKeyMetadata; +pub use crate::key::DataKeyPath; +#[cfg(feature = "experimental")] +pub use crate::request::AuxiliaryKeys; +pub use crate::request::DataLocale; +pub use crate::request::DataRequest; +pub use crate::request::DataRequestMetadata; +pub use crate::response::Cart; +pub use crate::response::DataPayload; +pub use crate::response::DataResponse; +pub use crate::response::DataResponseMetadata; +#[cfg(feature = "macros")] +pub use icu_provider_macros::data_struct; + +// Reexports from public modules +pub use crate::any::AnyMarker; +pub use crate::any::AnyPayload; +pub use crate::any::AnyProvider; +pub use crate::any::AnyResponse; +pub use crate::any::AsDowncastingAnyProvider; +pub use crate::any::AsDynamicDataProviderAnyMarkerWrap; +pub use crate::any::MaybeSendSync; +pub use crate::buf::BufferMarker; +pub use crate::buf::BufferProvider; +pub use crate::marker::DataMarker; +pub use crate::marker::KeyedDataMarker; +#[cfg(feature = "serde")] +pub use crate::serde::AsDeserializingBufferProvider; + +/// Core selection of APIs and structures for the ICU4X data provider. +pub mod prelude { + #[doc(no_inline)] + pub use crate::data_key; + #[doc(no_inline)] + pub use crate::AnyMarker; + #[doc(no_inline)] + pub use crate::AnyPayload; + #[doc(no_inline)] + pub use crate::AnyProvider; + #[doc(no_inline)] + pub use crate::AnyResponse; + #[doc(no_inline)] + #[cfg(feature = "serde")] + pub use crate::AsDeserializingBufferProvider; + #[doc(no_inline)] + pub use crate::AsDowncastingAnyProvider; + #[doc(no_inline)] + pub use crate::AsDynamicDataProviderAnyMarkerWrap; + #[doc(no_inline)] + #[cfg(feature = "experimental")] + pub use crate::AuxiliaryKeys; + #[doc(no_inline)] + pub use crate::BufferMarker; + #[doc(no_inline)] + pub use crate::BufferProvider; + #[doc(no_inline)] + pub use crate::DataError; + #[doc(no_inline)] + pub use crate::DataErrorKind; + #[doc(no_inline)] + pub use crate::DataKey; + #[doc(no_inline)] + pub use crate::DataKeyHash; + #[doc(no_inline)] + pub use crate::DataLocale; + #[doc(no_inline)] + pub use crate::DataMarker; + #[doc(no_inline)] + pub use crate::DataPayload; + #[doc(no_inline)] + pub use crate::DataProvider; + #[doc(no_inline)] + pub use crate::DataRequest; + #[doc(no_inline)] + pub use crate::DataRequestMetadata; + #[doc(no_inline)] + pub use crate::DataResponse; + #[doc(no_inline)] + pub use crate::DataResponseMetadata; + #[doc(no_inline)] + pub use crate::DynamicDataProvider; + #[doc(no_inline)] + pub use crate::KeyedDataMarker; + + #[doc(hidden)] + pub use yoke; + #[doc(hidden)] + pub use zerofrom; +} + +// Additional crate re-exports for compatibility +#[doc(hidden)] +pub use fallback::LocaleFallbackPriority as FallbackPriority; +#[doc(hidden)] +pub use fallback::LocaleFallbackSupplement as FallbackSupplement; +#[doc(hidden)] +pub use yoke; +#[doc(hidden)] +pub use zerofrom; + +// For macros +#[doc(hidden)] +pub mod _internal { + pub use super::fallback::{LocaleFallbackPriority, LocaleFallbackSupplement}; + pub use icu_locid as locid; +} |