#![allow(clippy::exhaustive_structs, clippy::exhaustive_enums)]
use icu_provider::prelude::*;
mod serde_dfa;
pub use serde_dfa::SerdeDFA;
use zerovec::VarZeroCow;
#[cfg(feature = "compiled_data")]
#[derive(Debug)]
pub struct Baked;
#[cfg(feature = "compiled_data")]
#[allow(unused_imports)]
const _: () = {
use icu_list_data::*;
pub mod icu {
pub use crate as list;
pub use icu_locale as locale;
}
make_provider!(Baked);
impl_list_and_v1!(Baked);
impl_list_or_v1!(Baked);
impl_list_unit_v1!(Baked);
};
#[cfg(feature = "datagen")]
pub const MARKERS: &[DataMarkerInfo] = &[ListAndV1::INFO, ListOrV1::INFO, ListUnitV1::INFO];
data_marker!(
ListAndV1,
"list/and/v1",
ListFormatterPatterns<'static>,
);
data_marker!(
ListOrV1,
"list/or/v1",
ListFormatterPatterns<'static>,
);
data_marker!(
ListUnitV1,
"list/unit/v1",
ListFormatterPatterns<'static>,
);
icu_provider::data_struct!(
ListFormatterPatterns<'_>,
#[cfg(feature = "datagen")]
);
#[derive(Clone, Debug, PartialEq, yoke::Yokeable, zerofrom::ZeroFrom)]
#[cfg_attr(feature = "datagen", derive(serde::Serialize, databake::Bake))]
#[cfg_attr(feature = "datagen", databake(path = icu_list::provider))]
#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
pub struct ListFormatterPatterns<'data> {
#[cfg_attr(feature = "serde", serde(borrow))]
pub start: ListJoinerPattern<'data>,
#[cfg_attr(feature = "serde", serde(borrow))]
pub middle: VarZeroCow<'data, str>,
#[cfg_attr(feature = "serde", serde(borrow))]
pub end: ConditionalListJoinerPattern<'data>,
#[cfg_attr(feature = "serde", serde(borrow))]
pub pair: Option<ConditionalListJoinerPattern<'data>>,
}
impl ListFormatterPatterns<'_> {
pub const NARROW: &'static DataMarkerAttributes = DataMarkerAttributes::from_str_or_panic("N");
#[doc(hidden)]
pub const NARROW_STR: &'static str = Self::NARROW.as_str();
pub const SHORT: &'static DataMarkerAttributes = DataMarkerAttributes::from_str_or_panic("S");
#[doc(hidden)]
pub const SHORT_STR: &'static str = Self::SHORT.as_str();
pub const WIDE: &'static DataMarkerAttributes = DataMarkerAttributes::from_str_or_panic("W");
#[doc(hidden)]
pub const WIDE_STR: &'static str = Self::WIDE.as_str();
}
#[derive(Clone, Debug, PartialEq, yoke::Yokeable, zerofrom::ZeroFrom)]
#[cfg_attr(feature = "datagen", derive(serde::Serialize, databake::Bake))]
#[cfg_attr(feature = "datagen", databake(path = icu_list::provider))]
#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
pub struct ConditionalListJoinerPattern<'data> {
#[cfg_attr(feature = "serde", serde(borrow))]
pub default: ListJoinerPattern<'data>,
#[cfg_attr(
feature = "serde",
serde(borrow, deserialize_with = "SpecialCasePattern::deserialize_option")
)]
pub special_case: Option<SpecialCasePattern<'data>>,
}
#[derive(Clone, Debug, PartialEq, yoke::Yokeable, zerofrom::ZeroFrom)]
#[cfg_attr(feature = "datagen", derive(serde::Serialize, databake::Bake))]
#[cfg_attr(feature = "datagen", databake(path = icu_list::provider))]
pub struct SpecialCasePattern<'data> {
pub condition: SerdeDFA<'data>,
pub pattern: ListJoinerPattern<'data>,
}
#[cfg(feature = "serde")]
impl<'data> SpecialCasePattern<'data> {
fn deserialize_option<'de: 'data, D>(deserializer: D) -> Result<Option<Self>, D::Error>
where
D: serde::de::Deserializer<'de>,
{
use serde::Deserialize;
#[derive(Deserialize)]
struct SpecialCasePatternOptionalDfa<'data> {
#[cfg_attr(
feature = "serde",
serde(borrow, deserialize_with = "SerdeDFA::maybe_deserialize")
)]
pub condition: Option<SerdeDFA<'data>>,
#[cfg_attr(feature = "serde", serde(borrow))]
pub pattern: ListJoinerPattern<'data>,
}
Ok(
match Option::<SpecialCasePatternOptionalDfa<'data>>::deserialize(deserializer)? {
Some(SpecialCasePatternOptionalDfa {
condition: Some(condition),
pattern,
}) => Some(SpecialCasePattern { condition, pattern }),
_ => None,
},
)
}
}
#[derive(Clone, Debug, PartialEq, yoke::Yokeable, zerofrom::ZeroFrom)]
#[cfg_attr(feature = "datagen", derive(serde::Serialize))]
pub struct ListJoinerPattern<'data> {
pub(crate) string: VarZeroCow<'data, str>,
#[cfg_attr(feature = "datagen", serde(skip))]
pub(crate) index_0: u8,
pub(crate) index_1: u8,
}
#[cfg(feature = "serde")]
impl<'de: 'data, 'data> serde::Deserialize<'de> for ListJoinerPattern<'data> {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
#[derive(serde::Deserialize)]
struct Dummy<'data> {
#[cfg_attr(feature = "serde", serde(borrow))]
string: VarZeroCow<'data, str>,
index_1: u8,
}
let Dummy { string, index_1 } = Dummy::deserialize(deserializer)?;
if index_1 as usize > string.len() {
use serde::de::Error;
Err(D::Error::custom("invalid index_1"))
} else {
Ok(ListJoinerPattern {
string,
index_0: 0,
index_1,
})
}
}
}
impl<'a> ListJoinerPattern<'a> {
pub const fn from_parts(string: VarZeroCow<'a, str>, index_1: u8) -> Self {
Self {
string,
index_0: 0,
index_1,
}
}
}
#[cfg(feature = "datagen")]
impl databake::Bake for ListJoinerPattern<'_> {
fn bake(&self, env: &databake::CrateEnv) -> databake::TokenStream {
env.insert("icu_list");
let string = self.string.bake(env);
let index_1 = self.index_1.bake(env);
databake::quote! {
icu_list::provider::ListJoinerPattern::from_parts(#string, #index_1)
}
}
}
#[cfg(feature = "datagen")]
impl databake::BakeSize for ListJoinerPattern<'_> {
fn borrows_size(&self) -> usize {
self.string.borrows_size()
}
}
#[cfg(all(test, feature = "datagen"))]
#[test]
fn databake() {
databake::test_bake!(
ListJoinerPattern,
const,
crate::provider::ListJoinerPattern::from_parts(
unsafe { zerovec::VarZeroCow::from_bytes_unchecked(b", ") },
2u8
),
icu_list
);
}