Skip to content

Commit 88b64b4

Browse files
committed
Separate TimeSymbols from DateSymbols
Partial fix for unicode-org#380
1 parent 2568d2a commit 88b64b4

File tree

248 files changed

+5980
-8283
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

248 files changed

+5980
-8283
lines changed

components/datetime/src/any.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use icu_provider::prelude::*;
1818
use crate::provider::{
1919
calendar::{
2020
DatePatternsV1Marker, DateSkeletonPatternsV1Marker, DateSymbolsV1Marker,
21-
TimePatternsV1Marker,
21+
TimePatternsV1Marker, TimeSymbolsV1Marker,
2222
},
2323
week_data::WeekDataV1Marker,
2424
};
@@ -179,6 +179,7 @@ impl AnyDateTimeFormat {
179179
where
180180
T: Into<Locale>,
181181
P: ResourceProvider<DateSymbolsV1Marker>
182+
+ ResourceProvider<TimeSymbolsV1Marker>
182183
+ ResourceProvider<DatePatternsV1Marker>
183184
+ ResourceProvider<TimePatternsV1Marker>
184185
+ ResourceProvider<DateSkeletonPatternsV1Marker>

components/datetime/src/datetime.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::{
99
options::{components, DateTimeFormatOptions},
1010
provider::calendar::{
1111
DatePatternsV1Marker, DateSkeletonPatternsV1Marker, DateSymbolsV1Marker,
12-
TimePatternsV1Marker,
12+
TimePatternsV1Marker, TimeSymbolsV1Marker,
1313
},
1414
provider::week_data::WeekDataV1Marker,
1515
raw,
@@ -90,6 +90,7 @@ impl<C: CldrCalendar> DateTimeFormat<C> {
9090
) -> Result<Self, DateTimeFormatError>
9191
where
9292
D: ResourceProvider<DateSymbolsV1Marker>
93+
+ ResourceProvider<TimeSymbolsV1Marker>
9394
+ ResourceProvider<DatePatternsV1Marker>
9495
+ ResourceProvider<TimePatternsV1Marker>
9596
+ ResourceProvider<DateSkeletonPatternsV1Marker>

components/datetime/src/format/datetime.rs

+53-24
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use crate::pattern::{
1111
};
1212
use crate::provider;
1313
use crate::provider::calendar::patterns::PatternPluralsFromPatternsV1Marker;
14-
use crate::provider::date_time::DateTimeSymbols;
14+
use crate::provider::date_time::{DateSymbols, TimeSymbols};
1515
use crate::provider::week_data::WeekDataV1;
1616

1717
use core::fmt;
@@ -52,7 +52,8 @@ where
5252
T: DateTimeInput,
5353
{
5454
pub(crate) patterns: &'l DataPayload<PatternPluralsFromPatternsV1Marker>,
55-
pub(crate) symbols: Option<&'l provider::calendar::DateSymbolsV1<'l>>,
55+
pub(crate) date_symbols: Option<&'l provider::calendar::DateSymbolsV1<'l>>,
56+
pub(crate) time_symbols: Option<&'l provider::calendar::TimeSymbolsV1<'l>>,
5657
pub(crate) datetime: &'l T,
5758
pub(crate) week_data: Option<&'l WeekDataV1>,
5859
pub(crate) locale: &'l Locale,
@@ -67,7 +68,8 @@ where
6768
fn write_to<W: fmt::Write + ?Sized>(&self, sink: &mut W) -> fmt::Result {
6869
write_pattern_plurals(
6970
&self.patterns.get().0,
70-
self.symbols,
71+
self.date_symbols,
72+
self.time_symbols,
7173
self.datetime,
7274
self.week_data,
7375
self.ordinal_rules,
@@ -130,7 +132,8 @@ where
130132

131133
fn write_pattern<T, W>(
132134
pattern: &crate::pattern::runtime::Pattern,
133-
symbols: Option<&provider::calendar::DateSymbolsV1>,
135+
date_symbols: Option<&provider::calendar::DateSymbolsV1>,
136+
time_symbols: Option<&provider::calendar::TimeSymbolsV1>,
134137
loc_datetime: &impl LocalizedDateTimeInput<T>,
135138
fixed_decimal_format: &FixedDecimalFormat,
136139
w: &mut W,
@@ -146,7 +149,8 @@ where
146149
pattern,
147150
field,
148151
iter.peek(),
149-
symbols,
152+
date_symbols,
153+
time_symbols,
150154
loc_datetime,
151155
fixed_decimal_format,
152156
w,
@@ -161,7 +165,8 @@ where
161165
#[allow(clippy::too_many_arguments)]
162166
pub fn write_pattern_plurals<T, W>(
163167
patterns: &PatternPlurals,
164-
symbols: Option<&provider::calendar::DateSymbolsV1>,
168+
date_symbols: Option<&provider::calendar::DateSymbolsV1>,
169+
time_symbols: Option<&provider::calendar::TimeSymbolsV1>,
165170
datetime: &T,
166171
week_data: Option<&WeekDataV1>,
167172
ordinal_rules: Option<&PluralRules>,
@@ -175,19 +180,28 @@ where
175180
{
176181
let loc_datetime = DateTimeInputWithLocale::new(datetime, week_data.map(|d| &d.0), locale);
177182
let pattern = patterns.select(&loc_datetime, ordinal_rules)?;
178-
write_pattern(pattern, symbols, &loc_datetime, fixed_decimal_format, w)
183+
write_pattern(
184+
pattern,
185+
date_symbols,
186+
time_symbols,
187+
&loc_datetime,
188+
fixed_decimal_format,
189+
w,
190+
)
179191
}
180192

181193
// This function assumes that the correct decision has been
182194
// made regarding availability of symbols in the caller.
183195
//
184196
// When modifying the list of fields using symbols,
185197
// update the matching query in `analyze_pattern` function.
198+
#[allow(clippy::too_many_arguments)]
186199
pub(super) fn write_field<T, W>(
187200
pattern: &crate::pattern::runtime::Pattern,
188201
field: fields::Field,
189202
next_item: Option<&PatternItem>,
190-
symbols: Option<&crate::provider::calendar::DateSymbolsV1>,
203+
date_symbols: Option<&crate::provider::calendar::DateSymbolsV1>,
204+
time_symbols: Option<&crate::provider::calendar::TimeSymbolsV1>,
191205
datetime: &impl LocalizedDateTimeInput<T>,
192206
fixed_decimal_format: &FixedDecimalFormat,
193207
w: &mut W,
@@ -199,8 +213,8 @@ where
199213
match field.symbol {
200214
FieldSymbol::Era => {
201215
#[allow(clippy::expect_used)] // TODO(#1668) Clippy exceptions need docs or fixing.
202-
let symbol = symbols
203-
.expect("Expect symbols to be present")
216+
let symbol = date_symbols
217+
.expect("Expect date symbols to be present")
204218
.get_symbol_for_era(
205219
field.length,
206220
datetime
@@ -246,8 +260,8 @@ where
246260
)?,
247261
length => {
248262
#[allow(clippy::expect_used)] // TODO(#1668) Clippy exceptions need docs or fixing.
249-
let symbol = symbols
250-
.expect("Expect symbols to be present")
263+
let symbol = date_symbols
264+
.expect("Expect date symbols to be present")
251265
.get_symbol_for_month(
252266
month,
253267
length,
@@ -280,8 +294,8 @@ where
280294
.iso_weekday()
281295
.ok_or(Error::MissingInputField)?;
282296
#[allow(clippy::expect_used)] // TODO(#1668) Clippy exceptions need docs or fixing.
283-
let symbol = symbols
284-
.expect("Expect symbols to be present")
297+
let symbol = date_symbols
298+
.expect("Expect date symbols to be present")
285299
.get_symbol_for_weekday(weekday, field.length, dow)?;
286300
w.write_str(symbol)?
287301
}
@@ -390,8 +404,8 @@ where
390404
}
391405
FieldSymbol::DayPeriod(period) => {
392406
#[allow(clippy::expect_used)] // TODO(#1668) Clippy exceptions need docs or fixing.
393-
let symbol = symbols
394-
.expect("Expect symbols to be present")
407+
let symbol = time_symbols
408+
.expect("Expect time symbols to be present")
395409
.get_symbol_for_day_period(
396410
period,
397411
field.length,
@@ -413,7 +427,9 @@ where
413427
#[derive(Default)]
414428
pub struct RequiredData {
415429
// DateSymbolsV1 is required.
416-
pub symbols_data: bool,
430+
pub date_symbols_data: bool,
431+
// TimeSymbolsV1 is required.
432+
pub time_symbols_data: bool,
417433
// WeekDataV1 is required.
418434
pub week_data: bool,
419435
}
@@ -434,16 +450,20 @@ impl RequiredData {
434450
});
435451

436452
for field in fields {
437-
if !self.symbols_data {
438-
self.symbols_data = match field.symbol {
453+
if !self.date_symbols_data {
454+
self.date_symbols_data = match field.symbol {
439455
FieldSymbol::Era => true,
440456
FieldSymbol::Month(_) => {
441457
!matches!(field.length, FieldLength::One | FieldLength::TwoDigit)
442458
}
443-
FieldSymbol::Weekday(_) | FieldSymbol::DayPeriod(_) => true,
459+
FieldSymbol::Weekday(_) => true,
444460
_ => false,
445461
}
446462
}
463+
if !self.time_symbols_data {
464+
self.time_symbols_data = matches!(field.symbol, FieldSymbol::DayPeriod(_));
465+
}
466+
447467
if !self.week_data {
448468
self.week_data = matches!(
449469
field.symbol,
@@ -452,7 +472,7 @@ impl RequiredData {
452472
}
453473

454474
if supports_time_zones {
455-
if self.symbols_data && self.week_data {
475+
if self.date_symbols_data && self.time_symbols_data && self.week_data {
456476
// If we support time zones, and require everything else, we
457477
// know all we need to return already.
458478
return Ok(true);
@@ -492,13 +512,21 @@ mod tests {
492512
#[test]
493513
#[cfg(feature = "serde")]
494514
fn test_basic() {
495-
use crate::provider::calendar::DateSymbolsV1Marker;
515+
use crate::provider::calendar::{DateSymbolsV1Marker, TimeSymbolsV1Marker};
496516
use icu_calendar::DateTime;
497517
use icu_provider::prelude::*;
498518

499519
let provider = icu_testdata::get_provider();
500520
let locale: Locale = "en-u-ca-gregory".parse().unwrap();
501-
let data: DataPayload<DateSymbolsV1Marker> = provider
521+
let date_data: DataPayload<DateSymbolsV1Marker> = provider
522+
.load_resource(&DataRequest {
523+
options: locale.clone().into(),
524+
metadata: Default::default(),
525+
})
526+
.unwrap()
527+
.take_payload()
528+
.unwrap();
529+
let time_data: DataPayload<TimeSymbolsV1Marker> = provider
502530
.load_resource(&DataRequest {
503531
options: locale.clone().into(),
504532
metadata: Default::default(),
@@ -515,7 +543,8 @@ mod tests {
515543
let loc_datetime = DateTimeInputWithLocale::new(&datetime, None, &"und".parse().unwrap());
516544
write_pattern(
517545
&pattern,
518-
Some(data.get()),
546+
Some(date_data.get()),
547+
Some(time_data.get()),
519548
&loc_datetime,
520549
&fixed_decimal_format,
521550
&mut sink,

components/datetime/src/format/zoned_datetime.rs

+10-3
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,15 @@ where
102102
T: ZonedDateTimeInput,
103103
W: fmt::Write + ?Sized,
104104
{
105-
let symbols = zoned_datetime_format
105+
let date_symbols = zoned_datetime_format
106106
.datetime_format
107-
.symbols
107+
.date_symbols
108+
.as_ref()
109+
.map(|s| s.get());
110+
111+
let time_symbols = zoned_datetime_format
112+
.datetime_format
113+
.time_symbols
108114
.as_ref()
109115
.map(|s| s.get());
110116

@@ -118,7 +124,8 @@ where
118124
pattern,
119125
field,
120126
next_item,
121-
symbols,
127+
date_symbols,
128+
time_symbols,
122129
loc_datetime,
123130
&zoned_datetime_format.datetime_format.fixed_decimal_format,
124131
w,

components/datetime/src/provider/calendar/symbols.rs

+37-19
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use icu_provider::{yoke, zerofrom};
1313
use tinystr::{tinystr, TinyStr4};
1414
use zerovec::ZeroMap;
1515

16-
#[icu_provider::data_struct(DateSymbolsV1Marker = "datetime/symbols@1")]
16+
#[icu_provider::data_struct(DateSymbolsV1Marker = "datetime/datesymbols@1")]
1717
#[derive(Debug, PartialEq, Clone, Default)]
1818
#[cfg_attr(
1919
feature = "datagen",
@@ -28,11 +28,23 @@ pub struct DateSymbolsV1<'data> {
2828
#[cfg_attr(feature = "serde", serde(borrow))]
2929
pub weekdays: weekdays::ContextsV1<'data>,
3030
#[cfg_attr(feature = "serde", serde(borrow))]
31-
pub day_periods: day_periods::ContextsV1<'data>,
32-
#[cfg_attr(feature = "serde", serde(borrow))]
3331
pub eras: Eras<'data>,
3432
}
3533

34+
#[icu_provider::data_struct(TimeSymbolsV1Marker = "datetime/timesymbols@1")]
35+
#[derive(Debug, PartialEq, Clone, Default)]
36+
#[cfg_attr(
37+
feature = "datagen",
38+
derive(serde::Serialize, databake::Bake),
39+
databake(path = icu_datetime::provider::calendar),
40+
)]
41+
#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
42+
#[yoke(prove_covariance_manually)]
43+
pub struct TimeSymbolsV1<'data> {
44+
#[cfg_attr(feature = "serde", serde(borrow))]
45+
pub day_periods: day_periods::ContextsV1<'data>,
46+
}
47+
3648
#[derive(Debug, PartialEq, Clone, Default, yoke::Yokeable, zerofrom::ZeroFrom)]
3749
#[cfg_attr(
3850
feature = "datagen",
@@ -241,7 +253,7 @@ mod test {
241253
use super::*;
242254
use tinystr::tinystr;
243255

244-
fn serialize() -> Vec<u8> {
256+
fn serialize_date() -> Vec<u8> {
245257
let months = [
246258
(&MonthCode(tinystr!(4, "M01")), "January"),
247259
(&MonthCode(tinystr!(4, "M02")), "February"),
@@ -268,13 +280,6 @@ mod test {
268280
Cow::Owned("Sunday".to_string()),
269281
]);
270282

271-
let day_periods = day_periods::SymbolsV1 {
272-
am: Cow::Owned("am".to_string()),
273-
pm: Cow::Owned("pm".to_string()),
274-
noon: Some(Cow::Owned("noon".to_string())),
275-
midnight: None,
276-
};
277-
278283
bincode::serialize(&DateSymbolsV1 {
279284
months: months::ContextsV1 {
280285
format: months::FormatWidthsV1 {
@@ -304,6 +309,24 @@ mod test {
304309
wide: Some(weekdays.clone()),
305310
}),
306311
},
312+
eras: Eras {
313+
names: ZeroMap::new(),
314+
abbr: ZeroMap::new(),
315+
narrow: ZeroMap::new(),
316+
},
317+
})
318+
.unwrap()
319+
}
320+
321+
fn serialize_time() -> Vec<u8> {
322+
let day_periods = day_periods::SymbolsV1 {
323+
am: Cow::Owned("am".to_string()),
324+
pm: Cow::Owned("pm".to_string()),
325+
noon: Some(Cow::Owned("noon".to_string())),
326+
midnight: None,
327+
};
328+
329+
bincode::serialize(&TimeSymbolsV1 {
307330
day_periods: day_periods::ContextsV1 {
308331
format: day_periods::FormatWidthsV1 {
309332
abbreviated: day_periods.clone(),
@@ -318,18 +341,13 @@ mod test {
318341
wide: Some(day_periods.clone()),
319342
}),
320343
},
321-
eras: Eras {
322-
names: ZeroMap::new(),
323-
abbr: ZeroMap::new(),
324-
narrow: ZeroMap::new(),
325-
},
326344
})
327345
.unwrap()
328346
}
329347

330348
#[test]
331349
fn weekdays_borrows() {
332-
let bytes = serialize();
350+
let bytes = serialize_date();
333351
let de = bincode::deserialize::<DateSymbolsV1>(&bytes).unwrap();
334352

335353
assert!(matches!(de.weekdays.format.narrow.0[2], Cow::Borrowed(_)));
@@ -341,8 +359,8 @@ mod test {
341359

342360
#[test]
343361
fn day_periods_borrows() {
344-
let bytes = serialize();
345-
let de = bincode::deserialize::<DateSymbolsV1>(&bytes).unwrap();
362+
let bytes = serialize_time();
363+
let de = bincode::deserialize::<TimeSymbolsV1>(&bytes).unwrap();
346364

347365
assert!(matches!(
348366
de.day_periods.format.narrow.noon,

0 commit comments

Comments
 (0)