Skip to main content

holodeck_simctl_core/models/
appearance.rs

1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
2pub enum Appearance {
3    Light,
4    Dark,
5}
6
7impl Appearance {
8    pub fn raw_value(self) -> &'static str {
9        match self {
10            Appearance::Light => "light",
11            Appearance::Dark => "dark",
12        }
13    }
14}
15
16#[derive(Debug, Clone, Copy, PartialEq, Eq)]
17pub enum BatteryState {
18    Charging,
19    Charged,
20    Discharging,
21}
22
23impl BatteryState {
24    pub fn raw_value(self) -> &'static str {
25        match self {
26            BatteryState::Charging => "charging",
27            BatteryState::Charged => "charged",
28            BatteryState::Discharging => "discharging",
29        }
30    }
31}
32
33#[derive(Debug, Clone, Default, PartialEq, Eq)]
34pub struct StatusBarOverrides {
35    pub time: Option<String>,
36    pub battery_state: Option<BatteryState>,
37    pub battery_level: Option<i64>,
38    pub wifi_bars: Option<i64>,
39    pub cellular_bars: Option<i64>,
40    pub operator_name: Option<String>,
41}
42
43impl StatusBarOverrides {
44    pub fn is_empty(&self) -> bool {
45        self.time.is_none()
46            && self.battery_state.is_none()
47            && self.battery_level.is_none()
48            && self.wifi_bars.is_none()
49            && self.cellular_bars.is_none()
50            && self.operator_name.is_none()
51    }
52
53    pub fn simctl_arguments(&self) -> Vec<String> {
54        let mut args = Vec::new();
55        if let Some(time) = &self.time {
56            args.push("--time".to_string());
57            args.push(time.clone());
58        }
59        if let Some(state) = self.battery_state {
60            args.push("--batteryState".to_string());
61            args.push(state.raw_value().to_string());
62        }
63        if let Some(level) = self.battery_level {
64            args.push("--batteryLevel".to_string());
65            args.push(level.to_string());
66        }
67        if let Some(bars) = self.wifi_bars {
68            args.push("--wifiBars".to_string());
69            args.push(bars.to_string());
70        }
71        if let Some(bars) = self.cellular_bars {
72            args.push("--cellularBars".to_string());
73            args.push(bars.to_string());
74        }
75        if let Some(name) = &self.operator_name {
76            args.push("--operatorName".to_string());
77            args.push(name.clone());
78        }
79        args
80    }
81}
82
83#[cfg(test)]
84mod tests {
85    use super::*;
86
87    #[test]
88    fn empty_overrides_report_empty() {
89        assert!(StatusBarOverrides::default().is_empty());
90    }
91
92    #[test]
93    fn builds_simctl_arguments_in_order() {
94        let overrides = StatusBarOverrides { time: Some("9:41".to_string()), battery_level: Some(100), ..Default::default() };
95        assert_eq!(overrides.simctl_arguments(), vec!["--time", "9:41", "--batteryLevel", "100"]);
96    }
97}