diff --git a/components/datetime/src/format.rs b/components/datetime/src/format.rs index 110ed4a62e2..b118f15eb40 100644 --- a/components/datetime/src/format.rs +++ b/components/datetime/src/format.rs @@ -46,7 +46,7 @@ where T: DateTimeInput, { pub(crate) pattern: &'l Pattern, - pub(crate) data: &'l provider::gregory::DatesV1, + pub(crate) symbols: &'l provider::gregory::DateSymbolsV1, pub(crate) date_time: &'l T, pub(crate) locale: &'l Locale, } @@ -56,8 +56,14 @@ where T: DateTimeInput, { fn write_to(&self, sink: &mut W) -> fmt::Result { - write_pattern(self.pattern, self.data, self.date_time, self.locale, sink) - .map_err(|_| std::fmt::Error) + write_pattern( + self.pattern, + self.symbols, + self.date_time, + self.locale, + sink, + ) + .map_err(|_| std::fmt::Error) } // TODO(#489): Implement write_len @@ -68,7 +74,7 @@ where T: DateTimeInput, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write_pattern(self.pattern, self.data, self.date_time, self.locale, f) + write_pattern(self.pattern, self.symbols, self.date_time, self.locale, f) .map_err(|_| std::fmt::Error) } } @@ -95,7 +101,7 @@ where pub fn write_pattern( pattern: &crate::pattern::Pattern, - data: &provider::gregory::DatesV1, + symbols: &provider::gregory::DateSymbolsV1, date_time: &T, locale: &Locale, w: &mut W, @@ -107,7 +113,7 @@ where let loc_date_time = DateTimeInputWithLocale::new(date_time, locale); for item in pattern.items() { match item { - PatternItem::Field(field) => write_field(pattern, &field, data, &loc_date_time, w)?, + PatternItem::Field(field) => write_field(pattern, &field, symbols, &loc_date_time, w)?, PatternItem::Literal(l) => w.write_str(l)?, } } @@ -117,7 +123,7 @@ where fn write_field( pattern: &crate::pattern::Pattern, field: &fields::Field, - data: &crate::provider::gregory::DatesV1, + symbols: &crate::provider::gregory::DateSymbolsV1, date_time: &impl LocalizedDateTimeInput, w: &mut W, ) -> Result<(), Error> @@ -146,7 +152,7 @@ where field.length, )?, length => { - let symbol = data.symbols.get_symbol_for_month( + let symbol = symbols.get_symbol_for_month( month, length, date_time @@ -164,9 +170,7 @@ where .date_time() .iso_weekday() .ok_or(Error::MissingInputField)?; - let symbol = data - .symbols - .get_symbol_for_weekday(weekday, field.length, dow); + let symbol = symbols.get_symbol_for_weekday(weekday, field.length, dow); w.write_str(symbol)? } FieldSymbol::Day(..) => format_number( @@ -227,7 +231,7 @@ where field.length, )?, FieldSymbol::DayPeriod(period) => { - let symbol = data.symbols.get_symbol_for_day_period( + let symbol = symbols.get_symbol_for_day_period( period, field.length, date_time @@ -254,9 +258,11 @@ mod tests { #[cfg(feature = "provider_serde")] fn test_basic() { use crate::mock::MockDateTime; + use crate::provider::gregory::DatesV1; use icu_provider::prelude::*; + use std::borrow::Cow; let provider = icu_testdata::get_provider(); - let data = provider + let data: Cow<'_, DatesV1> = provider .load_payload(&DataRequest { resource_path: ResourcePath { key: provider::key::GREGORY_V1, @@ -274,7 +280,7 @@ mod tests { let mut sink = String::new(); write_pattern( &pattern, - &data, + &data.symbols, &date_time, &"und".parse().unwrap(), &mut sink, diff --git a/components/datetime/src/lib.rs b/components/datetime/src/lib.rs index 5df1aacef6a..b93fa3dfdf0 100644 --- a/components/datetime/src/lib.rs +++ b/components/datetime/src/lib.rs @@ -136,7 +136,7 @@ use std::borrow::Cow; pub struct DateTimeFormat<'d> { locale: Locale, pattern: Pattern, - data: Cow<'d, provider::gregory::DatesV1>, + symbols: Cow<'d, provider::gregory::DateSymbolsV1>, } impl<'d> DateTimeFormat<'d> { @@ -185,10 +185,15 @@ impl<'d> DateTimeFormat<'d> { .get_pattern_for_options(options)? .unwrap_or_default(); + let symbols = match data { + Cow::Borrowed(data) => Cow::Borrowed(&data.symbols), + Cow::Owned(data) => Cow::Owned(data.symbols), + }; + Ok(Self { locale, pattern, - data, + symbols, }) } @@ -226,7 +231,7 @@ impl<'d> DateTimeFormat<'d> { { FormattedDateTime { pattern: &self.pattern, - data: &self.data, + symbols: &self.symbols, date_time: value, locale: &self.locale, } @@ -263,7 +268,7 @@ impl<'d> DateTimeFormat<'d> { w: &mut impl std::fmt::Write, value: &impl DateTimeInput, ) -> std::fmt::Result { - write_pattern(&self.pattern, &self.data, value, &self.locale, w) + write_pattern(&self.pattern, &self.symbols, value, &self.locale, w) .map_err(|_| std::fmt::Error) }