icu_datetime/provider/calendar/mod.rs
1// This file is part of ICU4X. For terms of use, please see the file
2// called LICENSE at the top level of the ICU4X source tree
3// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
4
5//! Data structs for calendar-specific symbols and patterns.
6
7#[cfg(feature = "datagen")]
8mod skeletons;
9mod symbols;
10
11use crate::provider::pattern;
12use crate::size_test_macro::size_test;
13use icu_provider::prelude::*;
14#[cfg(feature = "datagen")]
15pub use skeletons::*;
16pub use symbols::*;
17
18size_test!(DateLengths, date_lengths_v1_size, 224);
19
20/// Pattern data for dates.
21#[doc = date_lengths_v1_size!()]
22///
23/// <div class="stab unstable">
24/// 🚧 This code is considered unstable; it may change at any time, in breaking or non-breaking ways,
25/// including in SemVer minor releases. While the serde representation of data structs is guaranteed
26/// to be stable, their Rust representation might not be. Use with caution.
27/// </div>
28#[derive(Debug, PartialEq, Clone, Default, zerofrom::ZeroFrom, yoke::Yokeable)]
29#[cfg_attr(feature = "datagen", derive(serde::Serialize, databake::Bake))]
30#[cfg_attr(feature = "datagen", databake(path = icu_datetime::provider::calendar))]
31#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
32pub struct DateLengths<'data> {
33 /// Date pattern data, broken down by pattern length.
34 #[cfg_attr(feature = "serde", serde(borrow))]
35 pub date: patterns::LengthPatterns<'data>,
36
37 /// Patterns used to combine date and time length patterns into full date_time patterns.
38 #[cfg_attr(feature = "serde", serde(borrow))]
39 pub length_combinations: patterns::GenericLengthPatterns<'data>,
40}
41
42icu_provider::data_struct!(
43 DateLengths<'_>,
44 #[cfg(feature = "datagen")]
45);
46
47size_test!(TimeLengths, time_lengths_v1_size, 264);
48
49/// Pattern data for times.
50#[doc = time_lengths_v1_size!()]
51///
52/// <div class="stab unstable">
53/// 🚧 This code is considered unstable; it may change at any time, in breaking or non-breaking ways,
54/// including in SemVer minor releases. While the serde representation of data structs is guaranteed
55/// to be stable, their Rust representation might not be. Use with caution.
56/// </div>
57#[derive(Debug, PartialEq, Clone, Default, yoke::Yokeable, zerofrom::ZeroFrom)]
58#[cfg_attr(feature = "datagen", derive(serde::Serialize, databake::Bake))]
59#[cfg_attr(feature = "datagen", databake(path = icu_datetime::provider::calendar))]
60#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
61pub struct TimeLengths<'data> {
62 /// These patterns are common uses of time formatting, broken down by the length of the
63 /// pattern. Users can override the hour cycle with a preference, so there are two
64 /// pattern groups stored here. Note that the pattern will contain either h11 or h12.
65 #[cfg_attr(feature = "serde", serde(borrow))]
66 pub time_h11_h12: patterns::LengthPatterns<'data>,
67
68 /// These patterns are common uses of time formatting, broken down by the length of the
69 /// pattern. Users can override the hour cycle with a preference, so there are two
70 /// pattern groups stored here. Note that the pattern will contain either h23 or h24.
71 #[cfg_attr(feature = "serde", serde(borrow))]
72 pub time_h23_h24: patterns::LengthPatterns<'data>,
73
74 /// By default a locale will prefer one hour cycle type over another.
75 pub preferred_hour_cycle: pattern::CoarseHourCycle,
76}
77
78icu_provider::data_struct!(TimeLengths<'_>, #[cfg(feature = "datagen")]);
79
80/// Data structs for date / time patterns that store data corresponding to pattern lengths
81/// and/or plural forms.
82pub mod patterns {
83 use super::*;
84 use crate::provider::pattern::runtime::{self, GenericPattern};
85
86 /// An enum containing four lengths (full, long, medium, short) for interfacing
87 /// with [`LengthPatterns`] and [`GenericLengthPatterns`]
88 #[derive(Debug)]
89 pub enum FullLongMediumShort {
90 /// "full" length
91 Full,
92 /// "long" length
93 Long,
94 /// "medium" length
95 Medium,
96 /// "short" length
97 Short,
98 }
99
100 /// Data struct for date/time patterns broken down by pattern length.
101 ///
102 /// <div class="stab unstable">
103 /// 🚧 This code is considered unstable; it may change at any time, in breaking or non-breaking ways,
104 /// including in SemVer minor releases. While the serde representation of data structs is guaranteed
105 /// to be stable, their Rust representation might not be. Use with caution.
106 /// </div>
107 #[derive(Debug, PartialEq, Clone, Default, yoke::Yokeable, zerofrom::ZeroFrom)]
108 #[cfg_attr(feature = "datagen", derive(serde::Serialize, databake::Bake))]
109 #[cfg_attr(feature = "datagen", databake(path = icu_datetime::provider::calendar::patterns))]
110 #[cfg_attr(feature = "serde", derive(serde::Deserialize))]
111 pub struct LengthPatterns<'data> {
112 /// A full length date/time pattern.
113 #[cfg_attr(feature = "serde", serde(borrow))]
114 pub full: runtime::Pattern<'data>,
115 /// A long length date/time pattern.
116 #[cfg_attr(feature = "serde", serde(borrow))]
117 pub long: runtime::Pattern<'data>,
118 /// A medium length date/time pattern.
119 #[cfg_attr(feature = "serde", serde(borrow))]
120 pub medium: runtime::Pattern<'data>,
121 /// A short length date/time pattern.
122 #[cfg_attr(feature = "serde", serde(borrow))]
123 pub short: runtime::Pattern<'data>,
124 }
125
126 /// Data struct for generic date/time patterns, broken down by pattern length.
127 ///
128 /// <div class="stab unstable">
129 /// 🚧 This code is considered unstable; it may change at any time, in breaking or non-breaking ways,
130 /// including in SemVer minor releases. While the serde representation of data structs is guaranteed
131 /// to be stable, their Rust representation might not be. Use with caution.
132 /// </div>
133 #[derive(Debug, PartialEq, Clone, Default, yoke::Yokeable, zerofrom::ZeroFrom)]
134 #[cfg_attr(feature = "datagen", derive(serde::Serialize, databake::Bake))]
135 #[cfg_attr(feature = "datagen", databake(path = icu_datetime::provider::calendar::patterns))]
136 #[cfg_attr(feature = "serde", derive(serde::Deserialize))]
137 pub struct GenericLengthPatterns<'data> {
138 /// A full length glue pattern of other formatted elements.
139 #[cfg_attr(feature = "serde", serde(borrow))]
140 pub full: GenericPattern<'data>,
141 /// A long length glue pattern of other formatted elements.
142 #[cfg_attr(feature = "serde", serde(borrow))]
143 pub long: GenericPattern<'data>,
144 /// A medium length glue pattern of other formatted elements.
145 #[cfg_attr(feature = "serde", serde(borrow))]
146 pub medium: GenericPattern<'data>,
147 /// A short length glue pattern of other formatted elements.
148 #[cfg_attr(feature = "serde", serde(borrow))]
149 pub short: GenericPattern<'data>,
150 }
151}