1mod adapter;
8
9use crate::provider::pattern::runtime;
10use crate::size_test_macro::size_test;
11use alloc::borrow::Cow;
12use icu_pattern::SinglePlaceholderPattern;
13use icu_provider::prelude::*;
14use potential_utf::PotentialUtf8;
15use zerovec::{ule::tuplevar::Tuple2VarULE, VarZeroCow, VarZeroSlice, VarZeroVec};
16
17#[allow(missing_docs)]
25pub mod marker_attrs {
26 use icu_provider::DataMarkerAttributes;
27
28 pub const NUMERIC: &DataMarkerAttributes = DataMarkerAttributes::from_str_or_panic("1");
29 pub const ABBR: &DataMarkerAttributes = DataMarkerAttributes::from_str_or_panic("3");
30 pub const NARROW: &DataMarkerAttributes = DataMarkerAttributes::from_str_or_panic("4");
31 pub const WIDE: &DataMarkerAttributes = DataMarkerAttributes::from_str_or_panic("5");
32 pub const SHORT: &DataMarkerAttributes = DataMarkerAttributes::from_str_or_panic("6");
33 pub const ABBR_STANDALONE: &DataMarkerAttributes =
34 DataMarkerAttributes::from_str_or_panic("3s");
35 pub const NARROW_STANDALONE: &DataMarkerAttributes =
36 DataMarkerAttributes::from_str_or_panic("4s");
37 pub const WIDE_STANDALONE: &DataMarkerAttributes =
38 DataMarkerAttributes::from_str_or_panic("5s");
39 pub const SHORT_STANDALONE: &DataMarkerAttributes =
40 DataMarkerAttributes::from_str_or_panic("6s");
41
42 pub const PATTERN_LONG: &DataMarkerAttributes = DataMarkerAttributes::from_str_or_panic("l");
43 pub const PATTERN_MEDIUM: &DataMarkerAttributes = DataMarkerAttributes::from_str_or_panic("m");
44 pub const PATTERN_SHORT: &DataMarkerAttributes = DataMarkerAttributes::from_str_or_panic("s");
45
46 pub const PATTERN_LONG12: &DataMarkerAttributes =
49 DataMarkerAttributes::from_str_or_panic("l12");
50 pub const PATTERN_MEDIUM12: &DataMarkerAttributes =
51 DataMarkerAttributes::from_str_or_panic("m12");
52 pub const PATTERN_SHORT12: &DataMarkerAttributes =
53 DataMarkerAttributes::from_str_or_panic("s12");
54
55 pub const PATTERN_LONG24: &DataMarkerAttributes =
56 DataMarkerAttributes::from_str_or_panic("l24");
57 pub const PATTERN_MEDIUM24: &DataMarkerAttributes =
58 DataMarkerAttributes::from_str_or_panic("m24");
59 pub const PATTERN_SHORT24: &DataMarkerAttributes =
60 DataMarkerAttributes::from_str_or_panic("s24");
61
62 pub const PATTERN_LONG_DT: &DataMarkerAttributes =
63 DataMarkerAttributes::from_str_or_panic("ldt");
64 pub const PATTERN_MEDIUM_DT: &DataMarkerAttributes =
65 DataMarkerAttributes::from_str_or_panic("mdt");
66 pub const PATTERN_SHORT_DT: &DataMarkerAttributes =
67 DataMarkerAttributes::from_str_or_panic("sdt");
68
69 pub const PATTERN_LONG_DZ: &DataMarkerAttributes =
70 DataMarkerAttributes::from_str_or_panic("ldz");
71 pub const PATTERN_MEDIUM_DZ: &DataMarkerAttributes =
72 DataMarkerAttributes::from_str_or_panic("mdz");
73 pub const PATTERN_SHORT_DZ: &DataMarkerAttributes =
74 DataMarkerAttributes::from_str_or_panic("sdz");
75
76 pub const PATTERN_LONG_TZ: &DataMarkerAttributes =
77 DataMarkerAttributes::from_str_or_panic("ltz");
78 pub const PATTERN_MEDIUM_TZ: &DataMarkerAttributes =
79 DataMarkerAttributes::from_str_or_panic("mtz");
80 pub const PATTERN_SHORT_TZ: &DataMarkerAttributes =
81 DataMarkerAttributes::from_str_or_panic("stz");
82
83 pub const PATTERN_LONG_DTZ: &DataMarkerAttributes =
84 DataMarkerAttributes::from_str_or_panic("ldtz");
85 pub const PATTERN_MEDIUM_DTZ: &DataMarkerAttributes =
86 DataMarkerAttributes::from_str_or_panic("mdtz");
87 pub const PATTERN_SHORT_DTZ: &DataMarkerAttributes =
88 DataMarkerAttributes::from_str_or_panic("sdtz");
89
90 pub const NUMERIC_STR: &str = NUMERIC.as_str();
91 pub const ABBR_STR: &str = ABBR.as_str();
92 pub const NARROW_STR: &str = NARROW.as_str();
93 pub const WIDE_STR: &str = WIDE.as_str();
94 pub const SHORT_STR: &str = SHORT.as_str();
95 pub const ABBR_STANDALONE_STR: &str = ABBR_STANDALONE.as_str();
96 pub const NARROW_STANDALONE_STR: &str = NARROW_STANDALONE.as_str();
97 pub const WIDE_STANDALONE_STR: &str = WIDE_STANDALONE.as_str();
98 pub const SHORT_STANDALONE_STR: &str = SHORT_STANDALONE.as_str();
99
100 pub const PATTERN_LONG_STR: &str = PATTERN_LONG.as_str();
101 pub const PATTERN_MEDIUM_STR: &str = PATTERN_MEDIUM.as_str();
102 pub const PATTERN_SHORT_STR: &str = PATTERN_SHORT.as_str();
103
104 pub const PATTERN_LONG12_STR: &str = PATTERN_LONG12.as_str();
105 pub const PATTERN_MEDIUM12_STR: &str = PATTERN_MEDIUM12.as_str();
106 pub const PATTERN_SHORT12_STR: &str = PATTERN_SHORT12.as_str();
107
108 pub const PATTERN_LONG24_STR: &str = PATTERN_LONG24.as_str();
109 pub const PATTERN_MEDIUM24_STR: &str = PATTERN_MEDIUM24.as_str();
110 pub const PATTERN_SHORT24_STR: &str = PATTERN_SHORT24.as_str();
111
112 pub const PATTERN_LONG_DT_STR: &str = PATTERN_LONG_DT.as_str();
113 pub const PATTERN_MEDIUM_DT_STR: &str = PATTERN_MEDIUM_DT.as_str();
114 pub const PATTERN_SHORT_DT_STR: &str = PATTERN_SHORT_DT.as_str();
115
116 pub const PATTERN_LONG_DZ_STR: &str = PATTERN_LONG_DZ.as_str();
117 pub const PATTERN_MEDIUM_DZ_STR: &str = PATTERN_MEDIUM_DZ.as_str();
118 pub const PATTERN_SHORT_DZ_STR: &str = PATTERN_SHORT_DZ.as_str();
119
120 pub const PATTERN_LONG_TZ_STR: &str = PATTERN_LONG_TZ.as_str();
121 pub const PATTERN_MEDIUM_TZ_STR: &str = PATTERN_MEDIUM_TZ.as_str();
122 pub const PATTERN_SHORT_TZ_STR: &str = PATTERN_SHORT_TZ.as_str();
123
124 pub const PATTERN_LONG_DTZ_STR: &str = PATTERN_LONG_DTZ.as_str();
125 pub const PATTERN_MEDIUM_DTZ_STR: &str = PATTERN_MEDIUM_DTZ.as_str();
126 pub const PATTERN_SHORT_DTZ_STR: &str = PATTERN_SHORT_DTZ.as_str();
127
128 #[derive(Copy, Clone, Debug, PartialEq, Eq)]
140 #[allow(clippy::exhaustive_enums)] pub enum Length {
142 Abbr,
143 Narrow,
144 Wide,
145 Short,
146 Numeric,
147 }
148
149 #[derive(Copy, Clone, Debug, PartialEq, Eq)]
161 pub enum PatternLength {
162 Long,
163 Medium,
164 Short,
165 }
166
167 #[derive(Copy, Clone, Debug, PartialEq, Eq)]
179 #[allow(clippy::exhaustive_enums)] pub enum Context {
181 Format,
182 Standalone,
183 }
184
185 #[derive(Copy, Clone, Debug, PartialEq, Eq)]
195 #[allow(clippy::exhaustive_enums)] pub enum GlueType {
197 DateTime,
198 DateZone,
199 TimeZone,
200 DateTimeZone,
201 }
202
203 pub fn name_marker_attr_info(marker_attr: &DataMarkerAttributes) -> Option<(Context, Length)> {
211 use {Context::*, Length::*};
212 match &**marker_attr {
213 NUMERIC_STR => Some((Format, Numeric)),
214 ABBR_STR => Some((Format, Abbr)),
215 NARROW_STR => Some((Format, Narrow)),
216 WIDE_STR => Some((Format, Wide)),
217 SHORT_STR => Some((Format, Short)),
218 ABBR_STANDALONE_STR => Some((Standalone, Abbr)),
219 NARROW_STANDALONE_STR => Some((Standalone, Narrow)),
220 WIDE_STANDALONE_STR => Some((Standalone, Wide)),
221 SHORT_STANDALONE_STR => Some((Standalone, Short)),
222 _ => None,
223 }
224 }
225
226 pub fn pattern_marker_attr_info_for_glue(
234 marker_attr: &DataMarkerAttributes,
235 ) -> Option<(PatternLength, GlueType)> {
236 use {GlueType::*, PatternLength::*};
237 match &**marker_attr {
238 PATTERN_LONG_DT_STR => Some((Long, DateTime)),
239 PATTERN_MEDIUM_DT_STR => Some((Medium, DateTime)),
240 PATTERN_SHORT_DT_STR => Some((Short, DateTime)),
241
242 PATTERN_LONG_DZ_STR => Some((Long, DateZone)),
243 PATTERN_MEDIUM_DZ_STR => Some((Medium, DateZone)),
244 PATTERN_SHORT_DZ_STR => Some((Short, DateZone)),
245
246 PATTERN_LONG_TZ_STR => Some((Long, TimeZone)),
247 PATTERN_MEDIUM_TZ_STR => Some((Medium, TimeZone)),
248 PATTERN_SHORT_TZ_STR => Some((Short, TimeZone)),
249
250 PATTERN_LONG_DTZ_STR => Some((Long, DateTimeZone)),
251 PATTERN_MEDIUM_DTZ_STR => Some((Medium, DateTimeZone)),
252 PATTERN_SHORT_DTZ_STR => Some((Short, DateTimeZone)),
253
254 _ => None,
255 }
256 }
257
258 pub fn name_attr_for(context: Context, length: Length) -> &'static DataMarkerAttributes {
266 use {Context::*, Length::*};
267 match (context, length) {
268 (Format, Numeric) => NUMERIC,
269 (Format, Abbr) => ABBR,
270 (Format, Narrow) => NARROW,
271 (Format, Wide) => WIDE,
272 (Format, Short) => SHORT,
273 (Standalone, Numeric) => NUMERIC,
274 (Standalone, Abbr) => ABBR_STANDALONE,
275 (Standalone, Narrow) => NARROW_STANDALONE,
276 (Standalone, Wide) => WIDE_STANDALONE,
277 (Standalone, Short) => SHORT_STANDALONE,
278 }
279 }
280
281 pub fn pattern_marker_attr_for_glue(
282 length: PatternLength,
283 glue_type: GlueType,
284 ) -> &'static DataMarkerAttributes {
285 use {GlueType::*, PatternLength::*};
286 match (length, glue_type) {
287 (Long, DateTime) => PATTERN_LONG_DT,
288 (Medium, DateTime) => PATTERN_MEDIUM_DT,
289 (Short, DateTime) => PATTERN_SHORT_DT,
290
291 (Long, DateZone) => PATTERN_LONG_DZ,
292 (Medium, DateZone) => PATTERN_MEDIUM_DZ,
293 (Short, DateZone) => PATTERN_SHORT_DZ,
294
295 (Long, TimeZone) => PATTERN_LONG_TZ,
296 (Medium, TimeZone) => PATTERN_MEDIUM_TZ,
297 (Short, TimeZone) => PATTERN_SHORT_TZ,
298
299 (Long, DateTimeZone) => PATTERN_LONG_DTZ,
300 (Medium, DateTimeZone) => PATTERN_MEDIUM_DTZ,
301 (Short, DateTimeZone) => PATTERN_SHORT_DTZ,
302 }
303 }
304}
305
306icu_provider::data_marker!(
307 DatetimeNamesYearBuddhistV1,
309 YearNames<'static>,
310 #[cfg(feature = "datagen")]
311 attributes_domain = "datetime_year_length"
312);
313icu_provider::data_marker!(
314 DatetimeNamesYearChineseV1,
316 YearNames<'static>,
317 #[cfg(feature = "datagen")]
318 attributes_domain = "datetime_year_length"
319);
320icu_provider::data_marker!(
321 DatetimeNamesYearCopticV1,
323 YearNames<'static>,
324 #[cfg(feature = "datagen")]
325 attributes_domain = "datetime_year_length"
326);
327icu_provider::data_marker!(
328 DatetimeNamesYearDangiV1,
330 YearNames<'static>,
331 #[cfg(feature = "datagen")]
332 attributes_domain = "datetime_year_length"
333);
334icu_provider::data_marker!(
335 DatetimeNamesYearEthiopianV1,
337 YearNames<'static>,
338 #[cfg(feature = "datagen")]
339 attributes_domain = "datetime_year_length"
340);
341icu_provider::data_marker!(
342 DatetimeNamesYearGregorianV1,
344 YearNames<'static>,
345 #[cfg(feature = "datagen")]
346 attributes_domain = "datetime_year_length"
347);
348icu_provider::data_marker!(
349 DatetimeNamesYearHebrewV1,
351 YearNames<'static>,
352 #[cfg(feature = "datagen")]
353 attributes_domain = "datetime_year_length"
354);
355icu_provider::data_marker!(
356 DatetimeNamesYearIndianV1,
358 YearNames<'static>,
359 #[cfg(feature = "datagen")]
360 attributes_domain = "datetime_year_length"
361);
362icu_provider::data_marker!(
363 DatetimeNamesYearHijriV1,
365 YearNames<'static>,
366 #[cfg(feature = "datagen")]
367 attributes_domain = "datetime_year_length"
368);
369icu_provider::data_marker!(
370 DatetimeNamesYearJapaneseV1,
372 YearNames<'static>,
373 #[cfg(feature = "datagen")]
374 attributes_domain = "datetime_year_length"
375);
376icu_provider::data_marker!(
377 DatetimeNamesYearJapanextV1,
379 YearNames<'static>,
380 #[cfg(feature = "datagen")]
381 attributes_domain = "datetime_year_length"
382);
383icu_provider::data_marker!(
384 DatetimeNamesYearPersianV1,
386 YearNames<'static>,
387 #[cfg(feature = "datagen")]
388 attributes_domain = "datetime_year_length"
389);
390icu_provider::data_marker!(
391 DatetimeNamesYearRocV1,
393 YearNames<'static>,
394 #[cfg(feature = "datagen")]
395 attributes_domain = "datetime_year_length"
396);
397
398icu_provider::data_marker!(
399 DatetimeNamesMonthBuddhistV1,
401 MonthNames<'static>,
402 #[cfg(feature = "datagen")]
403 attributes_domain = "datetime_month_length"
404);
405icu_provider::data_marker!(
406 DatetimeNamesMonthChineseV1,
408 MonthNames<'static>,
409 #[cfg(feature = "datagen")]
410 attributes_domain = "datetime_month_length"
411);
412icu_provider::data_marker!(
413 DatetimeNamesMonthCopticV1,
415 MonthNames<'static>,
416 #[cfg(feature = "datagen")]
417 attributes_domain = "datetime_month_length"
418);
419icu_provider::data_marker!(
420 DatetimeNamesMonthDangiV1,
422 MonthNames<'static>,
423 #[cfg(feature = "datagen")]
424 attributes_domain = "datetime_month_length"
425);
426icu_provider::data_marker!(
427 DatetimeNamesMonthEthiopianV1,
429 MonthNames<'static>,
430 #[cfg(feature = "datagen")]
431 attributes_domain = "datetime_month_length"
432);
433icu_provider::data_marker!(
434 DatetimeNamesMonthGregorianV1,
436 MonthNames<'static>,
437 #[cfg(feature = "datagen")]
438 attributes_domain = "datetime_month_length"
439);
440icu_provider::data_marker!(
441 DatetimeNamesMonthHebrewV1,
443 MonthNames<'static>,
444 #[cfg(feature = "datagen")]
445 attributes_domain = "datetime_month_length"
446);
447icu_provider::data_marker!(
448 DatetimeNamesMonthIndianV1,
450 MonthNames<'static>,
451 #[cfg(feature = "datagen")]
452 attributes_domain = "datetime_month_length"
453);
454icu_provider::data_marker!(
455 DatetimeNamesMonthHijriV1,
457 MonthNames<'static>,
458 #[cfg(feature = "datagen")]
459 attributes_domain = "datetime_month_length"
460);
461icu_provider::data_marker!(
462 DatetimeNamesMonthJapaneseV1,
464 MonthNames<'static>,
465 #[cfg(feature = "datagen")]
466 attributes_domain = "datetime_month_length"
467);
468icu_provider::data_marker!(
469 DatetimeNamesMonthJapanextV1,
471 MonthNames<'static>,
472 #[cfg(feature = "datagen")]
473 attributes_domain = "datetime_month_length"
474);
475icu_provider::data_marker!(
476 DatetimeNamesMonthPersianV1,
478 MonthNames<'static>,
479 #[cfg(feature = "datagen")]
480 attributes_domain = "datetime_month_length"
481);
482icu_provider::data_marker!(
483 DatetimeNamesMonthRocV1,
485 MonthNames<'static>,
486 #[cfg(feature = "datagen")]
487 attributes_domain = "datetime_month_length"
488);
489
490icu_provider::data_marker!(
491 DatetimeNamesWeekdayV1,
493 LinearNames<'static>,
494);
495icu_provider::data_marker!(
496 DatetimeNamesDayperiodV1,
498 LinearNames<'static>,
499);
500icu_provider::data_marker!(
502 DatetimeNamesDayChineseV1,
504 LinearNames<'static>,
505);
506icu_provider::data_marker!(
507 DatetimeNamesDayDangiV1,
509 LinearNames<'static>,
510);
511icu_provider::data_marker!(
513 DatetimeNamesDayPlaceholderV1,
515 LinearNames<'static>,
516);
517
518icu_provider::data_marker!(
519 DatetimePatternsGlueV1,
521 GluePattern<'static>
522);
523
524size_test!(YearNames, year_names_v1_size, 32);
525
526#[doc = year_names_v1_size!()]
539#[derive(Debug, PartialEq, Clone, yoke::Yokeable, zerofrom::ZeroFrom)]
546#[cfg_attr(feature = "datagen", derive(serde::Serialize, databake::Bake))]
547#[cfg_attr(feature = "datagen", databake(path = icu_datetime::provider::neo))]
548#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
549#[yoke(prove_covariance_manually)]
550pub enum YearNames<'data> {
551 FixedEras(#[cfg_attr(feature = "serde", serde(borrow))] VarZeroVec<'data, str>),
555 VariableEras(#[cfg_attr(feature = "serde", serde(borrow))] YearNamesMap<'data>),
560 Cyclic(#[cfg_attr(feature = "serde", serde(borrow))] VarZeroVec<'data, str>),
562}
563
564icu_provider::data_struct!(
565 YearNames<'_>,
566 #[cfg(feature = "datagen")]
567);
568
569type YearNamesMap<'data> =
570 VarZeroCow<'data, Tuple2VarULE<VarZeroSlice<PotentialUtf8>, VarZeroSlice<str>>>;
571
572pub(crate) fn get_year_name_from_map<'a>(
573 map: &'a YearNamesMap<'_>,
574 year: &PotentialUtf8,
575) -> Option<&'a str> {
576 let idx = map.a().binary_search_by(|x| x.cmp(year)).ok()?;
577 map.b().get(idx)
578}
579
580size_test!(MonthNames, month_names_v1_size, 32);
581
582#[doc = month_names_v1_size!()]
587#[derive(Debug, PartialEq, Clone, yoke::Yokeable, zerofrom::ZeroFrom)]
594#[cfg_attr(feature = "datagen", derive(serde::Serialize, databake::Bake))]
595#[cfg_attr(feature = "datagen", databake(path = icu_datetime::provider::neo))]
596#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
597#[yoke(prove_covariance_manually)]
598pub enum MonthNames<'data> {
599 Linear(#[cfg_attr(feature = "serde", serde(borrow))] VarZeroVec<'data, str>),
603 LeapLinear(#[cfg_attr(feature = "serde", serde(borrow))] VarZeroVec<'data, str>),
610
611 LeapNumeric(
616 #[cfg_attr(
617 feature = "serde",
618 serde(
619 borrow,
620 deserialize_with = "icu_pattern::deserialize_borrowed_cow::<icu_pattern::SinglePlaceholder, _>"
621 )
622 )]
623 Cow<'data, SinglePlaceholderPattern>,
624 ),
625}
626
627icu_provider::data_struct!(
628 MonthNames<'_>,
629 #[cfg(feature = "datagen")]
630);
631
632size_test!(LinearNames, linear_names_v1_size, 24);
633
634#[doc = linear_names_v1_size!()]
643#[derive(Debug, PartialEq, Clone, yoke::Yokeable, zerofrom::ZeroFrom)]
650#[cfg_attr(feature = "datagen", derive(serde::Serialize, databake::Bake))]
651#[cfg_attr(feature = "datagen", databake(path = icu_datetime::provider::neo))]
652#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
653#[yoke(prove_covariance_manually)]
654pub struct LinearNames<'data> {
655 #[cfg_attr(feature = "serde", serde(borrow))]
656 pub names: VarZeroVec<'data, str>,
659}
660
661icu_provider::data_struct!(
662 LinearNames<'_>,
663 #[cfg(feature = "datagen")]
664);
665
666impl LinearNames<'_> {
667 pub(crate) fn am(&self) -> Option<&str> {
669 self.names.get(0)
670 }
671 pub(crate) fn pm(&self) -> Option<&str> {
673 self.names.get(1)
674 }
675 pub(crate) fn noon(&self) -> Option<&str> {
677 self.names
678 .get(2)
679 .and_then(|s| if s.is_empty() { None } else { Some(s) })
680 }
681 pub(crate) fn midnight(&self) -> Option<&str> {
683 self.names.get(3)
684 }
685}
686
687size_test!(GluePattern, glue_pattern_v1_size, 24);
694
695#[doc = glue_pattern_v1_size!()]
697#[derive(Debug, PartialEq, Clone, yoke::Yokeable, zerofrom::ZeroFrom)]
704#[cfg_attr(feature = "datagen", derive(serde::Serialize, databake::Bake))]
705#[cfg_attr(feature = "datagen", databake(path = icu_datetime::provider::neo))]
706#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
707#[yoke(prove_covariance_manually)]
708pub struct GluePattern<'data> {
709 #[cfg_attr(feature = "serde", serde(borrow))]
711 pub pattern: runtime::GenericPattern<'data>,
712}
713
714icu_provider::data_struct!(
715 GluePattern<'_>,
716 #[cfg(feature = "datagen")]
717);
718
719#[derive(Debug)]
721pub struct YearNamesV1;
722impl DynamicDataMarker for YearNamesV1 {
723 type DataStruct = YearNames<'static>;
724}
725
726#[derive(Debug)]
728pub struct MonthNamesV1;
729impl DynamicDataMarker for MonthNamesV1 {
730 type DataStruct = MonthNames<'static>;
731}
732
733pub use DatetimeNamesWeekdayV1 as WeekdayNamesV1;
735
736pub use DatetimeNamesDayperiodV1 as DayPeriodNamesV1;