1use fidl_fuchsia_settings::IntlSettings;
6use serde::{Deserialize, Serialize};
7use settings_common::inspect::event::Nameable;
8use settings_common::utils::Merge;
9
10#[derive(PartialEq, Debug, Clone, Serialize, Deserialize)]
11pub struct IntlInfo {
12 pub locales: Option<Vec<LocaleId>>,
13 pub temperature_unit: Option<TemperatureUnit>,
14 pub time_zone_id: Option<String>,
15 pub hour_cycle: Option<HourCycle>,
16}
17
18impl Nameable for IntlInfo {
19 const NAME: &str = "Intl";
20}
21
22impl Merge for IntlInfo {
23 fn merge(&self, other: Self) -> Self {
24 IntlInfo {
25 locales: other.locales.or_else(|| self.locales.clone()),
26 temperature_unit: other.temperature_unit.or(self.temperature_unit),
27 time_zone_id: other.time_zone_id.or_else(|| self.time_zone_id.clone()),
28 hour_cycle: other.hour_cycle.or(self.hour_cycle),
29 }
30 }
31}
32
33impl From<fidl_fuchsia_settings::IntlSettings> for IntlInfo {
34 fn from(src: IntlSettings) -> Self {
35 IntlInfo {
36 locales: src.locales.map(|locales| {
37 locales.into_iter().map(fidl_fuchsia_intl::LocaleId::into).collect()
38 }),
39 temperature_unit: src.temperature_unit.map(fidl_fuchsia_intl::TemperatureUnit::into),
40 time_zone_id: src.time_zone_id.map(|tz| tz.id),
41 hour_cycle: src.hour_cycle.map(fidl_fuchsia_settings::HourCycle::into),
42 }
43 }
44}
45
46impl From<IntlInfo> for fidl_fuchsia_settings::IntlSettings {
47 fn from(info: IntlInfo) -> IntlSettings {
48 IntlSettings {
49 locales: info.locales.map(|locales| locales.into_iter().map(LocaleId::into).collect()),
50 temperature_unit: info.temperature_unit.map(TemperatureUnit::into),
51 time_zone_id: info.time_zone_id.map(|tz| fidl_fuchsia_intl::TimeZoneId { id: tz }),
52 hour_cycle: info.hour_cycle.map(HourCycle::into),
53 ..Default::default()
54 }
55 }
56}
57
58#[derive(PartialEq, Debug, Clone, Serialize, Deserialize)]
59pub struct LocaleId {
60 pub id: String,
61}
62
63impl From<fidl_fuchsia_intl::LocaleId> for LocaleId {
64 fn from(src: fidl_fuchsia_intl::LocaleId) -> Self {
65 LocaleId { id: src.id }
66 }
67}
68
69impl From<LocaleId> for fidl_fuchsia_intl::LocaleId {
70 fn from(src: LocaleId) -> Self {
71 fidl_fuchsia_intl::LocaleId { id: src.id }
72 }
73}
74
75#[derive(PartialEq, Debug, Clone, Copy, Serialize, Deserialize)]
76pub enum TemperatureUnit {
77 Celsius,
78 Fahrenheit,
79}
80
81impl From<fidl_fuchsia_intl::TemperatureUnit> for TemperatureUnit {
82 fn from(src: fidl_fuchsia_intl::TemperatureUnit) -> Self {
83 match src {
84 fidl_fuchsia_intl::TemperatureUnit::Celsius => TemperatureUnit::Celsius,
85 fidl_fuchsia_intl::TemperatureUnit::Fahrenheit => TemperatureUnit::Fahrenheit,
86 }
87 }
88}
89
90impl From<TemperatureUnit> for fidl_fuchsia_intl::TemperatureUnit {
91 fn from(src: TemperatureUnit) -> Self {
92 match src {
93 TemperatureUnit::Celsius => fidl_fuchsia_intl::TemperatureUnit::Celsius,
94 TemperatureUnit::Fahrenheit => fidl_fuchsia_intl::TemperatureUnit::Fahrenheit,
95 }
96 }
97}
98
99#[derive(PartialEq, Debug, Clone, Copy, Serialize, Deserialize)]
100pub enum HourCycle {
101 Unknown,
102 H11,
103 H12,
104 H23,
105 H24,
106}
107
108impl From<fidl_fuchsia_settings::HourCycle> for HourCycle {
109 fn from(src: fidl_fuchsia_settings::HourCycle) -> Self {
110 match src {
111 fidl_fuchsia_settings::HourCycle::Unknown => HourCycle::Unknown,
112 fidl_fuchsia_settings::HourCycle::H11 => HourCycle::H11,
113 fidl_fuchsia_settings::HourCycle::H12 => HourCycle::H12,
114 fidl_fuchsia_settings::HourCycle::H23 => HourCycle::H23,
115 fidl_fuchsia_settings::HourCycle::H24 => HourCycle::H24,
116 }
117 }
118}
119
120impl From<HourCycle> for fidl_fuchsia_settings::HourCycle {
121 fn from(src: HourCycle) -> Self {
122 match src {
123 HourCycle::Unknown => fidl_fuchsia_settings::HourCycle::Unknown,
124 HourCycle::H11 => fidl_fuchsia_settings::HourCycle::H11,
125 HourCycle::H12 => fidl_fuchsia_settings::HourCycle::H12,
126 HourCycle::H23 => fidl_fuchsia_settings::HourCycle::H23,
127 HourCycle::H24 => fidl_fuchsia_settings::HourCycle::H24,
128 }
129 }
130}
131
132#[cfg(test)]
133mod tests {
134 use super::*;
135 use fidl_fuchsia_settings::IntlSettings;
136 use settings_storage::fidl_storage::FidlStorageConvertible;
137
138 const TIME_ZONE_ID: &str = "PDT";
139 const LOCALE_ID: &str = "en_us";
140
141 #[fuchsia::test]
142 fn fidl_storage_convertible_from_storable_empty() {
143 let info = IntlInfo::from_storable(IntlSettings::default());
144
145 assert_eq!(
146 info,
147 IntlInfo {
148 locales: None,
149 temperature_unit: None,
150 time_zone_id: None,
151 hour_cycle: None,
152 }
153 );
154 }
155
156 #[fuchsia::test]
157 fn fidl_storage_convertible_from_storable() {
158 let intl_settings = IntlSettings {
159 locales: Some(vec![fidl_fuchsia_intl::LocaleId { id: LOCALE_ID.into() }]),
160 temperature_unit: Some(fidl_fuchsia_intl::TemperatureUnit::Celsius),
161 time_zone_id: Some(fidl_fuchsia_intl::TimeZoneId { id: TIME_ZONE_ID.to_string() }),
162 hour_cycle: Some(fidl_fuchsia_settings::HourCycle::H12),
163 ..Default::default()
164 };
165
166 let info = IntlInfo::from_storable(intl_settings);
167
168 assert_eq!(
169 info,
170 IntlInfo {
171 locales: Some(vec![LocaleId { id: LOCALE_ID.into() }]),
172 temperature_unit: Some(TemperatureUnit::Celsius),
173 time_zone_id: Some(TIME_ZONE_ID.to_string()),
174 hour_cycle: Some(HourCycle::H12),
175 }
176 );
177 }
178
179 #[fuchsia::test]
180 fn fidl_storage_convertible_to_storable_empty() {
181 let info = IntlInfo {
182 locales: None,
183 temperature_unit: None,
184 time_zone_id: None,
185 hour_cycle: None,
186 };
187 let storable = info.to_storable();
188
189 assert_eq!(storable, IntlSettings::default(),);
190 }
191
192 #[fuchsia::test]
193 fn fidl_storage_convertible_to_storable() {
194 let info = IntlInfo {
195 locales: Some(vec![LocaleId { id: LOCALE_ID.into() }]),
196 temperature_unit: Some(TemperatureUnit::Celsius),
197 time_zone_id: Some(TIME_ZONE_ID.to_string()),
198 hour_cycle: Some(HourCycle::H12),
199 };
200
201 let storable = info.to_storable();
202
203 assert_eq!(
204 storable,
205 IntlSettings {
206 locales: Some(vec![fidl_fuchsia_intl::LocaleId { id: LOCALE_ID.into() }]),
207 temperature_unit: Some(fidl_fuchsia_intl::TemperatureUnit::Celsius),
208 time_zone_id: Some(fidl_fuchsia_intl::TimeZoneId { id: TIME_ZONE_ID.to_string() }),
209 hour_cycle: Some(fidl_fuchsia_settings::HourCycle::H12),
210 ..Default::default()
211 }
212 );
213 }
214}