blob: 2f624b40a8a91c6c8959d5beb0773b8928c9b3e7 [file] [log] [blame]
// 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 ).
use super::*;
use icu_locid::subtags::{Language, Region, Script};
use icu_provider::prelude::*;
use zerovec::ZeroMap;
#[icu_provider::data_struct(marker(
LikelySubtagsV1Marker,
"locid_transform/likelysubtags@1",
singleton
))]
#[derive(Debug, PartialEq, Clone)]
#[cfg_attr(
feature = "datagen",
derive(serde::Serialize, databake::Bake),
databake(path = icu_locid_transform::provider),
)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
/// This likely subtags data is used for the minimize and maximize operations.
/// Each field defines a mapping from an old identifier to a new identifier,
/// based upon the rules in
/// <https://www.unicode.org/reports/tr35/#Likely_Subtags>.
///
/// The data is stored is broken down into smaller vectors based upon the rules
/// defined for the likely subtags maximize algorithm.
///
/// For efficiency, only the relevant part of the LanguageIdentifier is stored
/// for searching and replacing. E.g., the `language_script` field is used to store
/// rules for `LanguageIdentifier`s that contain a language and a script, but not a
/// region.
///
/// <div class="stab unstable">
/// 🚧 This code is considered unstable; it may change at any time, in breaking or non-breaking ways,
/// including in SemVer minor releases. While the serde representation of data structs is guaranteed
/// to be stable, their Rust representation might not be. Use with caution.
/// </div>
#[yoke(prove_covariance_manually)]
pub struct LikelySubtagsV1<'data> {
/// Language and script.
#[cfg_attr(feature = "serde", serde(borrow))]
pub language_script: ZeroMap<'data, (UnvalidatedLanguage, UnvalidatedScript), Region>,
/// Language and region.
#[cfg_attr(feature = "serde", serde(borrow))]
pub language_region: ZeroMap<'data, (UnvalidatedLanguage, UnvalidatedRegion), Script>,
/// Just language.
#[cfg_attr(feature = "serde", serde(borrow))]
pub language: ZeroMap<'data, UnvalidatedLanguage, (Script, Region)>,
/// Script and region.
#[cfg_attr(feature = "serde", serde(borrow))]
pub script_region: ZeroMap<'data, (UnvalidatedScript, UnvalidatedRegion), Language>,
/// Just script.
#[cfg_attr(feature = "serde", serde(borrow))]
pub script: ZeroMap<'data, UnvalidatedScript, (Language, Region)>,
/// Just region.
#[cfg_attr(feature = "serde", serde(borrow))]
pub region: ZeroMap<'data, UnvalidatedRegion, (Language, Script)>,
/// Undefined.
pub und: (Language, Script, Region),
}
#[icu_provider::data_struct(marker(
LikelySubtagsForLanguageV1Marker,
"locid_transform/likelysubtags_l@1",
singleton
))]
#[derive(Debug, PartialEq, Clone)]
#[cfg_attr(
feature = "datagen",
derive(serde::Serialize, databake::Bake),
databake(path = icu_locid_transform::provider),
)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
/// This likely subtags data is used for the minimize and maximize operations.
/// Each field defines a mapping from an old identifier to a new identifier,
/// based upon the rules in
/// <https://www.unicode.org/reports/tr35/#Likely_Subtags>.
///
/// The data is stored is broken down into smaller vectors based upon the rules
/// defined for the likely subtags maximize algorithm.
///
/// For efficiency, only the relevant part of the LanguageIdentifier is stored
/// for searching and replacing. E.g., the `language_script` field is used to store
/// rules for `LanguageIdentifier`s that contain a language and a script, but not a
/// region.
///
/// This struct contains mappings when the input contains a language subtag.
/// Also see [`LikelySubtagsForScriptRegionV1`].
///
/// <div class="stab unstable">
/// 🚧 This code is considered unstable; it may change at any time, in breaking or non-breaking ways,
/// including in SemVer minor releases. While the serde representation of data structs is guaranteed
/// to be stable, their Rust representation might not be. Use with caution.
/// </div>
#[yoke(prove_covariance_manually)]
pub struct LikelySubtagsForLanguageV1<'data> {
/// Language and script.
#[cfg_attr(feature = "serde", serde(borrow))]
pub language_script: ZeroMap<'data, (UnvalidatedLanguage, UnvalidatedScript), Region>,
/// Language and region.
#[cfg_attr(feature = "serde", serde(borrow))]
pub language_region: ZeroMap<'data, (UnvalidatedLanguage, UnvalidatedRegion), Script>,
/// Just language.
#[cfg_attr(feature = "serde", serde(borrow))]
pub language: ZeroMap<'data, UnvalidatedLanguage, (Script, Region)>,
/// Undefined.
pub und: (Language, Script, Region),
}
impl<'data> From<LikelySubtagsV1<'data>> for LikelySubtagsForLanguageV1<'data> {
fn from(other: LikelySubtagsV1<'data>) -> Self {
Self {
language_script: other.language_script,
language_region: other.language_region,
language: other.language,
und: other.und,
}
}
}
impl<'data> LikelySubtagsForLanguageV1<'data> {
pub(crate) fn clone_from_borrowed(other: &LikelySubtagsV1<'data>) -> Self {
Self {
language_script: other.language_script.clone(),
language_region: other.language_region.clone(),
language: other.language.clone(),
und: other.und,
}
}
}
#[icu_provider::data_struct(marker(
LikelySubtagsForScriptRegionV1Marker,
"locid_transform/likelysubtags_sr@1",
singleton
))]
#[derive(Debug, PartialEq, Clone)]
#[cfg_attr(
feature = "datagen",
derive(serde::Serialize, databake::Bake),
databake(path = icu_locid_transform::provider),
)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
/// This likely subtags data is used for the minimize and maximize operations.
/// Each field defines a mapping from an old identifier to a new identifier,
/// based upon the rules in
/// <https://www.unicode.org/reports/tr35/#Likely_Subtags>.
///
/// The data is stored is broken down into smaller vectors based upon the rules
/// defined for the likely subtags maximize algorithm.
///
/// For efficiency, only the relevant part of the LanguageIdentifier is stored
/// for searching and replacing. E.g., the `script_region` field is used to store
/// rules for `LanguageIdentifier`s that contain a script and a region, but not a
/// language.
///
/// This struct contains mappings when the input does not contain a language subtag.
/// Also see [`LikelySubtagsForLanguageV1`].
///
/// <div class="stab unstable">
/// 🚧 This code is considered unstable; it may change at any time, in breaking or non-breaking ways,
/// including in SemVer minor releases. While the serde representation of data structs is guaranteed
/// to be stable, their Rust representation might not be. Use with caution.
/// </div>
#[yoke(prove_covariance_manually)]
pub struct LikelySubtagsForScriptRegionV1<'data> {
/// Script and region.
#[cfg_attr(feature = "serde", serde(borrow))]
pub script_region: ZeroMap<'data, (UnvalidatedScript, UnvalidatedRegion), Language>,
/// Just script.
#[cfg_attr(feature = "serde", serde(borrow))]
pub script: ZeroMap<'data, UnvalidatedScript, (Language, Region)>,
/// Just region.
#[cfg_attr(feature = "serde", serde(borrow))]
pub region: ZeroMap<'data, UnvalidatedRegion, (Language, Script)>,
}
impl<'data> From<LikelySubtagsV1<'data>> for LikelySubtagsForScriptRegionV1<'data> {
fn from(other: LikelySubtagsV1<'data>) -> Self {
Self {
script_region: other.script_region,
script: other.script,
region: other.region,
}
}
}
#[icu_provider::data_struct(marker(
LikelySubtagsExtendedV1Marker,
"locid_transform/likelysubtags_ext@1",
singleton
))]
#[derive(Debug, PartialEq, Clone)]
#[cfg_attr(
feature = "datagen",
derive(serde::Serialize, databake::Bake),
databake(path = icu_locid_transform::provider),
)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
/// This likely subtags data is used for full coverage of locales, including ones that
/// don't otherwise have data in the Common Locale Data Repository (CLDR).
///
/// <div class="stab unstable">
/// 🚧 This code is considered unstable; it may change at any time, in breaking or non-breaking ways,
/// including in SemVer minor releases. While the serde representation of data structs is guaranteed
/// to be stable, their Rust representation might not be. Use with caution.
/// </div>
#[yoke(prove_covariance_manually)]
pub struct LikelySubtagsExtendedV1<'data> {
/// Language and script.
#[cfg_attr(feature = "serde", serde(borrow))]
pub language_script: ZeroMap<'data, (UnvalidatedLanguage, UnvalidatedScript), Region>,
/// Language and region.
#[cfg_attr(feature = "serde", serde(borrow))]
pub language_region: ZeroMap<'data, (UnvalidatedLanguage, UnvalidatedRegion), Script>,
/// Just language.
#[cfg_attr(feature = "serde", serde(borrow))]
pub language: ZeroMap<'data, UnvalidatedLanguage, (Script, Region)>,
/// Script and region.
#[cfg_attr(feature = "serde", serde(borrow))]
pub script_region: ZeroMap<'data, (UnvalidatedScript, UnvalidatedRegion), Language>,
/// Just script.
#[cfg_attr(feature = "serde", serde(borrow))]
pub script: ZeroMap<'data, UnvalidatedScript, (Language, Region)>,
/// Just region.
#[cfg_attr(feature = "serde", serde(borrow))]
pub region: ZeroMap<'data, UnvalidatedRegion, (Language, Script)>,
}
impl<'data> From<LikelySubtagsV1<'data>> for LikelySubtagsExtendedV1<'data> {
fn from(other: LikelySubtagsV1<'data>) -> Self {
Self {
language_script: other.language_script,
language_region: other.language_region,
language: other.language,
script_region: other.script_region,
script: other.script,
region: other.region,
}
}
}