use icu_pattern::SinglePlaceholderPattern;
use icu_plurals::provider::PluralElementsPackedCow;
use icu_provider::prelude::*;
icu_provider::data_marker!(
UnitsDisplayNamesV1,
UnitsDisplayNames<'static>,
#[cfg(feature = "datagen")]
attributes_domain = "units"
);
#[derive(Clone, PartialEq, Debug, yoke::Yokeable, zerofrom::ZeroFrom)]
#[cfg_attr(feature = "datagen", derive(serde::Serialize))]
#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
#[yoke(prove_covariance_manually)]
pub struct UnitsDisplayNames<'data> {
#[cfg_attr(feature = "serde", serde(borrow))]
pub patterns: PluralElementsPackedCow<'data, SinglePlaceholderPattern>,
}
icu_provider::data_struct!(UnitsDisplayNames<'_>, #[cfg(feature = "datagen")]);
impl<'data> UnitsDisplayNames<'data> {
pub const unsafe fn from_bytes_unchecked(bytes: &'data [u8]) -> Self {
Self {
patterns: PluralElementsPackedCow {
elements: alloc::borrow::Cow::Borrowed(
icu_plurals::provider::PluralElementsPackedULE::from_bytes_unchecked(bytes),
),
},
}
}
}
#[cfg(feature = "datagen")]
impl databake::Bake for UnitsDisplayNames<'_> {
fn bake(&self, ctx: &databake::CrateEnv) -> databake::TokenStream {
use zerovec::ule::VarULE;
ctx.insert("icu_experimental::dimension::provider::units::display_names");
let bytes = self.patterns.elements.as_bytes().bake(ctx);
databake::quote! { unsafe {
icu_experimental::dimension::provider::units::display_names::UnitsDisplayNames::from_bytes_unchecked(#bytes)
}}
}
}
#[cfg(feature = "datagen")]
impl databake::BakeSize for UnitsDisplayNames<'_> {
fn borrows_size(&self) -> usize {
self.patterns.borrows_size()
}
}