use crate::{
pattern::runtime::PatternPlurals,
skeleton::{reference::Skeleton, SkeletonError},
};
use core::convert::TryFrom;
use icu_provider::{yoke, zerofrom};
use litemap::LiteMap;
#[icu_provider::data_struct(marker(
DateSkeletonPatternsV1Marker,
"datetime/skeletons@1",
fallback_by = "language",
extension_key = "ca",
))]
#[derive(Debug, PartialEq, Clone, Default)]
#[cfg_attr(feature = "datagen", derive(serde::Serialize))]
#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
pub struct DateSkeletonPatternsV1<'data>(
#[cfg_attr(feature = "serde", serde(borrow))]
#[zerofrom(clone)]
pub LiteMap<SkeletonV1, PatternPlurals<'data>>,
);
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone)]
#[cfg_attr(feature = "datagen", derive(serde::Serialize))]
#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
pub struct SkeletonV1(pub Skeleton);
impl TryFrom<&str> for SkeletonV1 {
type Error = SkeletonError;
fn try_from(skeleton_string: &str) -> Result<Self, Self::Error> {
match Skeleton::try_from(skeleton_string) {
Ok(skeleton) => Ok(Self(skeleton)),
Err(err) => Err(err),
}
}
}
#[cfg(feature = "datagen")]
impl databake::Bake for DateSkeletonPatternsV1<'_> {
fn bake(&self, env: &databake::CrateEnv) -> databake::TokenStream {
env.insert("icu_datetime");
let vals = self.0.iter().map(|(skeleton, pattern)| {
let fields = skeleton.0 .0.iter().map(|f| f.bake(env));
let pattern = pattern.bake(env);
databake::quote! {
(&[#(#fields),*], #pattern)
}
});
databake::quote! {
&[#(#vals),*]
}
}
}
#[cfg(feature = "datagen")]
impl Default for DateSkeletonPatternsV1Marker {
fn default() -> Self {
Self
}
}
#[cfg(feature = "datagen")]
impl databake::Bake for DateSkeletonPatternsV1Marker {
fn bake(&self, env: &databake::CrateEnv) -> databake::TokenStream {
env.insert("icu_datetime");
databake::quote! {
::icu_datetime::provider::calendar::DateSkeletonPatternsV1Marker
}
}
}
type BakedDateSkeletonPatternsV1 =
&'static [(&'static [crate::fields::Field], PatternPlurals<'static>)];
impl zerofrom::ZeroFrom<'static, BakedDateSkeletonPatternsV1> for DateSkeletonPatternsV1<'static> {
fn zero_from(other: &'static BakedDateSkeletonPatternsV1) -> Self {
Self(
other
.iter()
.map(|(fields, pattern)| {
(
SkeletonV1(Skeleton(fields.iter().cloned().collect())),
zerofrom::ZeroFrom::zero_from(pattern),
)
})
.collect(),
)
}
}