#![allow(clippy::exhaustive_structs, clippy::exhaustive_enums)]
use alloc::borrow::Cow;
use icu_provider::{yoke, zerofrom, DataError, DataMarker};
use zerovec::ZeroMap;
#[icu_provider::data_struct(
LongSecondRelativeTimeFormatDataV1Marker = "relativetime/long/second@1",
ShortSecondRelativeTimeFormatDataV1Marker = "relativetime/short/second@1",
NarrowSecondRelativeTimeFormatDataV1Marker = "relativetime/narrow/second@1",
LongMinuteRelativeTimeFormatDataV1Marker = "relativetime/long/minute@1",
ShortMinuteRelativeTimeFormatDataV1Marker = "relativetime/short/minute@1",
NarrowMinuteRelativeTimeFormatDataV1Marker = "relativetime/narrow/minute@1",
LongHourRelativeTimeFormatDataV1Marker = "relativetime/long/hour@1",
ShortHourRelativeTimeFormatDataV1Marker = "relativetime/short/hour@1",
NarrowHourRelativeTimeFormatDataV1Marker = "relativetime/narrow/hour@1",
LongDayRelativeTimeFormatDataV1Marker = "relativetime/long/day@1",
ShortDayRelativeTimeFormatDataV1Marker = "relativetime/short/day@1",
NarrowDayRelativeTimeFormatDataV1Marker = "relativetime/narrow/day@1",
LongWeekRelativeTimeFormatDataV1Marker = "relativetime/long/week@1",
ShortWeekRelativeTimeFormatDataV1Marker = "relativetime/short/week@1",
NarrowWeekRelativeTimeFormatDataV1Marker = "relativetime/narrow/week@1",
LongMonthRelativeTimeFormatDataV1Marker = "relativetime/long/month@1",
ShortMonthRelativeTimeFormatDataV1Marker = "relativetime/short/month@1",
NarrowMonthRelativeTimeFormatDataV1Marker = "relativetime/narrow/month@1",
LongQuarterRelativeTimeFormatDataV1Marker = "relativetime/long/quarter@1",
ShortQuarterRelativeTimeFormatDataV1Marker = "relativetime/short/quarter@1",
NarrowQuarterRelativeTimeFormatDataV1Marker = "relativetime/narrow/quarter@1",
LongYearRelativeTimeFormatDataV1Marker = "relativetime/long/year@1",
ShortYearRelativeTimeFormatDataV1Marker = "relativetime/short/year@1",
NarrowYearRelativeTimeFormatDataV1Marker = "relativetime/narrow/year@1"
)]
#[derive(Debug, Clone, Default, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
#[cfg_attr(
feature = "datagen",
derive(serde::Serialize, databake::Bake),
databake(path = icu_relativetime::provider)
)]
#[yoke(prove_covariance_manually)]
pub struct RelativeTimePatternDataV1<'data> {
#[cfg_attr(feature = "serde", serde(borrow))]
pub relatives: ZeroMap<'data, i8, str>,
#[cfg_attr(feature = "serde", serde(borrow))]
pub past: PluralRulesCategoryMapping<'data>,
#[cfg_attr(feature = "serde", serde(borrow))]
pub future: PluralRulesCategoryMapping<'data>,
}
#[derive(Debug, Clone, Default, PartialEq, yoke::Yokeable, zerofrom::ZeroFrom)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
#[cfg_attr(
feature = "datagen",
derive(serde::Serialize, databake::Bake),
databake(path = icu_relativetime::provider)
)]
#[yoke(prove_covariance_manually)]
pub struct PluralRulesCategoryMapping<'data> {
#[cfg_attr(feature = "serde", serde(borrow))]
pub zero: Option<SingularSubPattern<'data>>,
#[cfg_attr(feature = "serde", serde(borrow))]
pub one: Option<SingularSubPattern<'data>>,
#[cfg_attr(feature = "serde", serde(borrow))]
pub two: Option<SingularSubPattern<'data>>,
#[cfg_attr(feature = "serde", serde(borrow))]
pub few: Option<SingularSubPattern<'data>>,
#[cfg_attr(feature = "serde", serde(borrow))]
pub many: Option<SingularSubPattern<'data>>,
#[cfg_attr(feature = "serde", serde(borrow))]
pub other: SingularSubPattern<'data>,
}
#[derive(Debug, Clone, Default, PartialEq, yoke::Yokeable, zerofrom::ZeroFrom)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
#[cfg_attr(
feature = "datagen",
derive(serde::Serialize, databake::Bake),
databake(path = icu_relativetime::provider)
)]
pub struct SingularSubPattern<'data> {
#[cfg_attr(feature = "serde", serde(borrow))]
pub pattern: Cow<'data, str>,
pub index: u8,
}
impl<'data> SingularSubPattern<'data> {
pub fn try_from_str(value: &str) -> Result<Self, DataError> {
let (pattern, index) = if let Some(index) = value.find("{0}") {
if index >= 255 {
return Err(DataError::custom("Placeholder index too large to store."));
}
(
format!("{}{}", &value[..index], &value[index + 3..]),
index as u8,
)
} else {
(value.to_string(), 255u8)
};
Ok(Self {
pattern: Cow::Owned(pattern),
index,
})
}
}
pub(crate) struct ErasedRelativeTimeFormatV1Marker;
impl DataMarker for ErasedRelativeTimeFormatV1Marker {
type Yokeable = RelativeTimePatternDataV1<'static>;
}