@@ -11,7 +11,7 @@ use crate::pattern::{
11
11
} ;
12
12
use crate :: provider;
13
13
use crate :: provider:: calendar:: patterns:: PatternPluralsFromPatternsV1Marker ;
14
- use crate :: provider:: date_time:: DateTimeSymbols ;
14
+ use crate :: provider:: date_time:: { DateSymbols , TimeSymbols } ;
15
15
use crate :: provider:: week_data:: WeekDataV1 ;
16
16
17
17
use core:: fmt;
52
52
T : DateTimeInput ,
53
53
{
54
54
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 > > ,
56
57
pub ( crate ) datetime : & ' l T ,
57
58
pub ( crate ) week_data : Option < & ' l WeekDataV1 > ,
58
59
pub ( crate ) locale : & ' l Locale ,
67
68
fn write_to < W : fmt:: Write + ?Sized > ( & self , sink : & mut W ) -> fmt:: Result {
68
69
write_pattern_plurals (
69
70
& self . patterns . get ( ) . 0 ,
70
- self . symbols ,
71
+ self . date_symbols ,
72
+ self . time_symbols ,
71
73
self . datetime ,
72
74
self . week_data ,
73
75
self . ordinal_rules ,
@@ -130,7 +132,8 @@ where
130
132
131
133
fn write_pattern < T , W > (
132
134
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 > ,
134
137
loc_datetime : & impl LocalizedDateTimeInput < T > ,
135
138
fixed_decimal_format : & FixedDecimalFormat ,
136
139
w : & mut W ,
@@ -146,7 +149,8 @@ where
146
149
pattern,
147
150
field,
148
151
iter. peek ( ) ,
149
- symbols,
152
+ date_symbols,
153
+ time_symbols,
150
154
loc_datetime,
151
155
fixed_decimal_format,
152
156
w,
@@ -161,7 +165,8 @@ where
161
165
#[ allow( clippy:: too_many_arguments) ]
162
166
pub fn write_pattern_plurals < T , W > (
163
167
patterns : & PatternPlurals ,
164
- symbols : Option < & provider:: calendar:: DateSymbolsV1 > ,
168
+ date_symbols : Option < & provider:: calendar:: DateSymbolsV1 > ,
169
+ time_symbols : Option < & provider:: calendar:: TimeSymbolsV1 > ,
165
170
datetime : & T ,
166
171
week_data : Option < & WeekDataV1 > ,
167
172
ordinal_rules : Option < & PluralRules > ,
@@ -175,19 +180,28 @@ where
175
180
{
176
181
let loc_datetime = DateTimeInputWithLocale :: new ( datetime, week_data. map ( |d| & d. 0 ) , locale) ;
177
182
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
+ )
179
191
}
180
192
181
193
// This function assumes that the correct decision has been
182
194
// made regarding availability of symbols in the caller.
183
195
//
184
196
// When modifying the list of fields using symbols,
185
197
// update the matching query in `analyze_pattern` function.
198
+ #[ allow( clippy:: too_many_arguments) ]
186
199
pub ( super ) fn write_field < T , W > (
187
200
pattern : & crate :: pattern:: runtime:: Pattern ,
188
201
field : fields:: Field ,
189
202
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 > ,
191
205
datetime : & impl LocalizedDateTimeInput < T > ,
192
206
fixed_decimal_format : & FixedDecimalFormat ,
193
207
w : & mut W ,
@@ -199,8 +213,8 @@ where
199
213
match field. symbol {
200
214
FieldSymbol :: Era => {
201
215
#[ 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" )
204
218
. get_symbol_for_era (
205
219
field. length ,
206
220
datetime
@@ -246,8 +260,8 @@ where
246
260
) ?,
247
261
length => {
248
262
#[ 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" )
251
265
. get_symbol_for_month (
252
266
month,
253
267
length,
@@ -280,8 +294,8 @@ where
280
294
. iso_weekday ( )
281
295
. ok_or ( Error :: MissingInputField ) ?;
282
296
#[ 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" )
285
299
. get_symbol_for_weekday ( weekday, field. length , dow) ?;
286
300
w. write_str ( symbol) ?
287
301
}
@@ -390,8 +404,8 @@ where
390
404
}
391
405
FieldSymbol :: DayPeriod ( period) => {
392
406
#[ 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" )
395
409
. get_symbol_for_day_period (
396
410
period,
397
411
field. length ,
@@ -413,7 +427,9 @@ where
413
427
#[ derive( Default ) ]
414
428
pub struct RequiredData {
415
429
// DateSymbolsV1 is required.
416
- pub symbols_data : bool ,
430
+ pub date_symbols_data : bool ,
431
+ // TimeSymbolsV1 is required.
432
+ pub time_symbols_data : bool ,
417
433
// WeekDataV1 is required.
418
434
pub week_data : bool ,
419
435
}
@@ -434,16 +450,20 @@ impl RequiredData {
434
450
} ) ;
435
451
436
452
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 {
439
455
FieldSymbol :: Era => true ,
440
456
FieldSymbol :: Month ( _) => {
441
457
!matches ! ( field. length, FieldLength :: One | FieldLength :: TwoDigit )
442
458
}
443
- FieldSymbol :: Weekday ( _) | FieldSymbol :: DayPeriod ( _ ) => true ,
459
+ FieldSymbol :: Weekday ( _) => true ,
444
460
_ => false ,
445
461
}
446
462
}
463
+ if !self . time_symbols_data {
464
+ self . time_symbols_data = matches ! ( field. symbol, FieldSymbol :: DayPeriod ( _) ) ;
465
+ }
466
+
447
467
if !self . week_data {
448
468
self . week_data = matches ! (
449
469
field. symbol,
@@ -452,7 +472,7 @@ impl RequiredData {
452
472
}
453
473
454
474
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 {
456
476
// If we support time zones, and require everything else, we
457
477
// know all we need to return already.
458
478
return Ok ( true ) ;
@@ -492,13 +512,21 @@ mod tests {
492
512
#[ test]
493
513
#[ cfg( feature = "serde" ) ]
494
514
fn test_basic ( ) {
495
- use crate :: provider:: calendar:: DateSymbolsV1Marker ;
515
+ use crate :: provider:: calendar:: { DateSymbolsV1Marker , TimeSymbolsV1Marker } ;
496
516
use icu_calendar:: DateTime ;
497
517
use icu_provider:: prelude:: * ;
498
518
499
519
let provider = icu_testdata:: get_provider ( ) ;
500
520
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
502
530
. load_resource ( & DataRequest {
503
531
options : locale. clone ( ) . into ( ) ,
504
532
metadata : Default :: default ( ) ,
@@ -515,7 +543,8 @@ mod tests {
515
543
let loc_datetime = DateTimeInputWithLocale :: new ( & datetime, None , & "und" . parse ( ) . unwrap ( ) ) ;
516
544
write_pattern (
517
545
& pattern,
518
- Some ( data. get ( ) ) ,
546
+ Some ( date_data. get ( ) ) ,
547
+ Some ( time_data. get ( ) ) ,
519
548
& loc_datetime,
520
549
& fixed_decimal_format,
521
550
& mut sink,
0 commit comments