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}