Skip to content

Commit 65506d2

Browse files
committed
Split date and time data keys.
This is a first step towards fixing unicode-org#380.
1 parent 1e072b3 commit 65506d2

File tree

338 files changed

+7750
-9171
lines changed

Some content is hidden

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

338 files changed

+7750
-9171
lines changed

components/datetime/examples/work_log.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ fn print(_input: &str, _value: Option<usize>) {
4040
fn main(_argc: isize, _argv: *const *const u8) -> isize {
4141
icu_benchmark_macros::main_setup!();
4242

43-
let provider = icu_testdata::get_provider();
43+
let provider = icu_testdata::get_smaller_postcard_provider();
4444

4545
let dates = DATES_ISO
4646
.iter()

components/datetime/src/any.rs

+10-5
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ use icu_locid::Locale;
1616
use icu_provider::prelude::*;
1717

1818
use crate::provider::{
19-
calendar::{DatePatternsV1Marker, DateSkeletonPatternsV1Marker, DateSymbolsV1Marker},
19+
calendar::{
20+
DatePatternsV1Marker, DateSkeletonPatternsV1Marker, DateSymbolsV1Marker,
21+
TimePatternsV1Marker,
22+
},
2023
week_data::WeekDataV1Marker,
2124
};
2225
use crate::{date::DateTimeInput, DateTimeFormatError, FormattedDateTime};
@@ -70,8 +73,9 @@ impl AnyDateTimeFormat {
7073
/// Construct a new [`AnyDateTimeFormat`] from a data provider that implements
7174
/// [`AnyProvider`].
7275
///
73-
/// The provider must be able to provide data for the following keys: `datetime/symbols@1`, `datetime/lengths@1`,
74-
/// `datetime/symbols@1`, `datetime/skeletons@1`, `datetime/week_data@1`, and `plurals/ordinals@1`.
76+
/// The provider must be able to provide data for the following keys: `datetime/symbols@1`, `datetime/timelengths@1`,
77+
/// `datetime/timelengths@1`, `datetime/symbols@1`, `datetime/skeletons@1`, `datetime/week_data@1`, and `plurals/ordinals@1`.
78+
7579
///
7680
/// Furthermore, based on the type of calendar used, one of the following data keys may be necessary:
7781
///
@@ -92,8 +96,8 @@ impl AnyDateTimeFormat {
9296
/// Construct a new [`AnyDateTimeFormat`] from a data provider that implements
9397
/// [`BufferProvider`].
9498
///
95-
/// The provider must be able to provide data for the following keys: `datetime/symbols@1`, `datetime/lengths@1`,
96-
/// `datetime/symbols@1`, `datetime/skeletons@1`, `datetime/week_data@1`, and `plurals/ordinals@1`.
99+
/// The provider must be able to provide data for the following keys: `datetime/symbols@1`, `datetime/datelengths@1`,
100+
/// `datetime/timelengths@1`, `datetime/symbols@1`, `datetime/skeletons@1`, `datetime/week_data@1`, and `plurals/ordinals@1`.
97101
///
98102
/// Furthermore, based on the type of calendar used, one of the following data keys may be necessary:
99103
///
@@ -176,6 +180,7 @@ impl AnyDateTimeFormat {
176180
T: Into<Locale>,
177181
P: ResourceProvider<DateSymbolsV1Marker>
178182
+ ResourceProvider<DatePatternsV1Marker>
183+
+ ResourceProvider<TimePatternsV1Marker>
179184
+ ResourceProvider<DateSkeletonPatternsV1Marker>
180185
+ ResourceProvider<OrdinalV1Marker>
181186
+ ResourceProvider<WeekDataV1Marker>

components/datetime/src/datetime.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77
88
use crate::{
99
options::{components, DateTimeFormatOptions},
10-
provider::calendar::{DatePatternsV1Marker, DateSkeletonPatternsV1Marker, DateSymbolsV1Marker},
10+
provider::calendar::{
11+
DatePatternsV1Marker, DateSkeletonPatternsV1Marker, DateSymbolsV1Marker,
12+
TimePatternsV1Marker,
13+
},
1114
provider::week_data::WeekDataV1Marker,
1215
raw,
1316
};
@@ -88,6 +91,7 @@ impl<C: CldrCalendar> DateTimeFormat<C> {
8891
where
8992
D: ResourceProvider<DateSymbolsV1Marker>
9093
+ ResourceProvider<DatePatternsV1Marker>
94+
+ ResourceProvider<TimePatternsV1Marker>
9195
+ ResourceProvider<DateSkeletonPatternsV1Marker>
9296
+ ResourceProvider<DecimalSymbolsV1Marker>
9397
+ ResourceProvider<OrdinalV1Marker>

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

+15-5
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use icu_provider::{yoke, zerofrom};
1313
pub use skeletons::*;
1414
pub use symbols::*;
1515

16-
#[icu_provider::data_struct(DatePatternsV1Marker = "datetime/lengths@1")]
16+
#[icu_provider::data_struct(DatePatternsV1Marker = "datetime/datelengths@1")]
1717
#[derive(Debug, PartialEq, Clone, Default)]
1818
#[cfg_attr(
1919
feature = "datagen",
@@ -25,6 +25,20 @@ pub struct DatePatternsV1<'data> {
2525
#[cfg_attr(feature = "serde", serde(borrow))]
2626
pub date: patterns::LengthPatternsV1<'data>,
2727

28+
/// Patterns used to combine date and time length patterns into full date_time patterns.
29+
#[cfg_attr(feature = "serde", serde(borrow))]
30+
pub length_combinations: patterns::GenericLengthPatternsV1<'data>,
31+
}
32+
33+
#[icu_provider::data_struct(TimePatternsV1Marker = "datetime/timelengths@1")]
34+
#[derive(Debug, PartialEq, Clone, Default)]
35+
#[cfg_attr(
36+
feature = "datagen",
37+
derive(serde::Serialize, databake::Bake),
38+
databake(path = icu_datetime::provider::calendar),
39+
)]
40+
#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
41+
pub struct TimePatternsV1<'data> {
2842
/// These patterns are common uses of time formatting, broken down by the length of the
2943
/// pattern. Users can override the hour cycle with a preference, so there are two
3044
/// pattern groups stored here. Note that the pattern will contain either h11 or h12.
@@ -39,10 +53,6 @@ pub struct DatePatternsV1<'data> {
3953

4054
/// By default a locale will prefer one hour cycle type over another.
4155
pub preferred_hour_cycle: pattern::CoarseHourCycle,
42-
43-
/// Patterns used to combine date and time length patterns into full date_time patterns.
44-
#[cfg_attr(feature = "serde", serde(borrow))]
45-
pub length_combinations: patterns::GenericLengthPatternsV1<'data>,
4656
}
4757

4858
pub mod patterns {

components/datetime/src/provider/date_time.rs

+33-15
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ use crate::options::{components, length, preferences, DateTimeFormatOptions};
99
use crate::pattern::{hour_cycle, runtime::PatternPlurals};
1010
use crate::provider;
1111
use crate::provider::calendar::patterns::PatternPluralsV1;
12-
use crate::provider::calendar::DatePatternsV1;
1312
use crate::provider::calendar::{
1413
patterns::PatternPluralsFromPatternsV1Marker, DatePatternsV1Marker,
15-
DateSkeletonPatternsV1Marker,
14+
DateSkeletonPatternsV1Marker, TimePatternsV1Marker,
1615
};
16+
use crate::provider::calendar::{DatePatternsV1, TimePatternsV1};
1717
use crate::skeleton;
1818
use icu_calendar::types::{Era, MonthCode};
1919
use icu_locid::Locale;
@@ -22,7 +22,7 @@ use icu_provider::prelude::*;
2222
type Result<T> = core::result::Result<T, DateTimeFormatError>;
2323

2424
fn pattern_for_time_length_inner<'data>(
25-
data: DatePatternsV1<'data>,
25+
data: TimePatternsV1<'data>,
2626
length: length::Time,
2727
preferences: &Option<preferences::Bag>,
2828
) -> PatternPlurals<'data> {
@@ -81,6 +81,7 @@ impl<D: ?Sized> Clone for PatternSelector<'_, D> {
8181
impl<D> PatternSelector<'_, D>
8282
where
8383
D: ResourceProvider<DatePatternsV1Marker>
84+
+ ResourceProvider<TimePatternsV1Marker>
8485
+ ResourceProvider<DateSkeletonPatternsV1Marker>
8586
+ ?Sized,
8687
{
@@ -123,7 +124,7 @@ where
123124
self,
124125
length: length::Date,
125126
) -> Result<DataPayload<PatternPluralsFromPatternsV1Marker>> {
126-
let patterns_data = self.patterns_data_payload()?;
127+
let patterns_data = self.date_patterns_data_payload()?;
127128
Ok(
128129
patterns_data.map_project_with_capture(length, |data, length, _| {
129130
let pattern = pattern_for_date_length_inner(data, length);
@@ -140,7 +141,7 @@ where
140141
length: length::Time,
141142
preferences: Option<preferences::Bag>,
142143
) -> Result<DataPayload<PatternPluralsFromPatternsV1Marker>> {
143-
let patterns_data = self.patterns_data_payload()?;
144+
let patterns_data = self.time_patterns_data_payload()?;
144145
Ok(patterns_data.map_project_with_capture(
145146
(length, preferences),
146147
|data, (length, preferences), _| {
@@ -158,23 +159,29 @@ where
158159
time_length: length::Time,
159160
preferences: Option<preferences::Bag>,
160161
) -> Result<DataPayload<PatternPluralsFromPatternsV1Marker>> {
161-
let patterns_data = self.patterns_data_payload()?;
162-
patterns_data.try_map_project_with_capture(
163-
(date_length, time_length, preferences),
164-
|data, (date_length, time_length, preferences), _| {
162+
let time_patterns_data = self.time_patterns_data_payload()?;
163+
164+
let date_patterns_data = self.date_patterns_data_payload()?;
165+
date_patterns_data.try_map_project_with_capture(
166+
(date_length, time_length, preferences, time_patterns_data),
167+
|data, (date_length, time_length, preferences, time_patterns_data), _| {
165168
let date = pattern_for_date_length_inner(data.clone(), date_length)
166169
.expect_pattern("Lengths are single patterns");
167-
let time = pattern_for_time_length_inner(data.clone(), time_length, &preferences)
168-
.expect_pattern("Lengths are single patterns");
169170

170171
let pattern = match date_length {
171172
length::Date::Full => data.length_combinations.full,
172173
length::Date::Long => data.length_combinations.long,
173174
length::Date::Medium => data.length_combinations.medium,
174175
length::Date::Short => data.length_combinations.short,
175176
};
176-
let pattern = pattern.combined(date, time)?;
177-
Ok(PatternPlurals::from(pattern).into())
177+
178+
let time = pattern_for_time_length_inner(
179+
time_patterns_data.get().clone(),
180+
time_length,
181+
&preferences,
182+
)
183+
.expect_pattern("Lengths are single patterns");
184+
Ok(PatternPlurals::from(pattern.combined(date, time)?).into())
178185
},
179186
)
180187
}
@@ -185,7 +192,7 @@ where
185192
components: &components::Bag,
186193
) -> Result<DataPayload<PatternPluralsFromPatternsV1Marker>> {
187194
let skeletons_data = self.skeleton_data_payload()?;
188-
let patterns_data = self.patterns_data_payload()?;
195+
let patterns_data = self.date_patterns_data_payload()?;
189196
// Not all skeletons are currently supported.
190197
let requested_fields = components.to_vec_fields();
191198
let patterns = match skeleton::create_best_pattern_for_fields(
@@ -204,7 +211,18 @@ where
204211
patterns.into_owned(),
205212
)))
206213
}
207-
fn patterns_data_payload(self) -> Result<DataPayload<DatePatternsV1Marker>> {
214+
fn date_patterns_data_payload(self) -> Result<DataPayload<DatePatternsV1Marker>> {
215+
let data = self
216+
.data_provider
217+
.load_resource(&DataRequest {
218+
options: ResourceOptions::from(self.locale),
219+
metadata: Default::default(),
220+
})?
221+
.take_payload()?;
222+
Ok(data)
223+
}
224+
225+
fn time_patterns_data_payload(self) -> Result<DataPayload<TimePatternsV1Marker>> {
208226
let data = self
209227
.data_provider
210228
.load_resource(&DataRequest {

components/datetime/src/raw/datetime.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ use crate::{
1010
options::components,
1111
options::DateTimeFormatOptions,
1212
provider::calendar::patterns::PatternPluralsFromPatternsV1Marker,
13-
provider::calendar::{DatePatternsV1Marker, DateSkeletonPatternsV1Marker, DateSymbolsV1Marker},
13+
provider::calendar::{
14+
DatePatternsV1Marker, DateSkeletonPatternsV1Marker, DateSymbolsV1Marker,
15+
TimePatternsV1Marker,
16+
},
1417
provider::week_data::WeekDataV1Marker,
1518
};
1619
use alloc::string::String;
@@ -54,6 +57,7 @@ impl DateTimeFormat {
5457
where
5558
D: ResourceProvider<DateSymbolsV1Marker>
5659
+ ResourceProvider<DatePatternsV1Marker>
60+
+ ResourceProvider<TimePatternsV1Marker>
5761
+ ResourceProvider<DateSkeletonPatternsV1Marker>
5862
+ ResourceProvider<DecimalSymbolsV1Marker>
5963
+ ResourceProvider<OrdinalV1Marker>

components/datetime/src/raw/zoned_datetime.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ use crate::{
2222
pattern::runtime::PatternPlurals,
2323
provider::{
2424
self,
25-
calendar::{DatePatternsV1Marker, DateSkeletonPatternsV1Marker, DateSymbolsV1Marker},
25+
calendar::{
26+
DatePatternsV1Marker, DateSkeletonPatternsV1Marker, DateSymbolsV1Marker,
27+
TimePatternsV1Marker,
28+
},
2629
week_data::WeekDataV1Marker,
2730
},
2831
raw,
@@ -56,6 +59,7 @@ impl ZonedDateTimeFormat {
5659
where
5760
DP: ResourceProvider<DateSymbolsV1Marker>
5861
+ ResourceProvider<DatePatternsV1Marker>
62+
+ ResourceProvider<TimePatternsV1Marker>
5963
+ ResourceProvider<DateSkeletonPatternsV1Marker>
6064
+ ResourceProvider<WeekDataV1Marker>
6165
+ ?Sized,

components/datetime/src/zoned_datetime.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ use crate::{
1515
options::DateTimeFormatOptions,
1616
provider::{
1717
self,
18-
calendar::{DatePatternsV1Marker, DateSkeletonPatternsV1Marker, DateSymbolsV1Marker},
18+
calendar::{
19+
DatePatternsV1Marker, DateSkeletonPatternsV1Marker, DateSymbolsV1Marker,
20+
TimePatternsV1Marker,
21+
},
1922
week_data::WeekDataV1Marker,
2023
},
2124
raw,
@@ -121,6 +124,7 @@ impl<C: CldrCalendar> ZonedDateTimeFormat<C> {
121124
L: Into<Locale>,
122125
DP: ResourceProvider<DateSymbolsV1Marker>
123126
+ ResourceProvider<DatePatternsV1Marker>
127+
+ ResourceProvider<TimePatternsV1Marker>
124128
+ ResourceProvider<DateSkeletonPatternsV1Marker>
125129
+ ResourceProvider<WeekDataV1Marker>
126130
+ ?Sized,

0 commit comments

Comments
 (0)