Skip to main content

settings_intl/
types.rs

1// Copyright 2019 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use 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}