Skip to main content

sysd_manager_base/
enums.rs

1use gettextrs::pgettext;
2use glib::value::ToValue;
3use strum::EnumIter;
4use tracing::warn;
5
6#[derive(
7    Debug, Copy, Clone, PartialEq, Eq, glib::Enum, Default, EnumIter, Hash, Ord, PartialOrd,
8)]
9#[enum_type(name = "UnitDBusLevel")]
10pub enum UnitDBusLevel {
11    #[default]
12    #[enum_value(name = "system", nick = "System")]
13    System = 0,
14    #[enum_value(name = "user", nick = "User Session")]
15    UserSession = 1,
16    #[enum_value(name = "both", nick = "System & User")]
17    Both = 2,
18}
19
20impl UnitDBusLevel {
21    pub fn short(&self) -> &str {
22        match self {
23            UnitDBusLevel::System => "s",
24            UnitDBusLevel::UserSession => "u",
25            UnitDBusLevel::Both => "b",
26        }
27    }
28
29    pub fn normalize(&self) -> Self {
30        match self {
31            UnitDBusLevel::Both => UnitDBusLevel::System,
32            bus => *bus,
33        }
34    }
35
36    pub fn user_session(&self) -> bool {
37        matches!(self, UnitDBusLevel::UserSession)
38    }
39
40    pub fn as_str(&self) -> &'static str {
41        let level_value: &glib::EnumValue = self.to_value().get().expect("it's an enum");
42        level_value.name()
43    }
44
45    //used in browser table
46    pub fn label(&self) -> &'static str {
47        self.as_str()
48    }
49
50    pub fn nice_label(&self) -> String {
51        match self {
52            //menu option
53            UnitDBusLevel::UserSession => pgettext("dbus", "User Session"),
54            //menu option
55            _ => pgettext("dbus", "System"),
56        }
57    }
58
59    pub fn from_short(suffix: &str) -> Self {
60        match suffix {
61            "s" => UnitDBusLevel::System,
62            "u" => UnitDBusLevel::UserSession,
63            "b" => UnitDBusLevel::Both,
64            _ => UnitDBusLevel::System,
65        }
66    }
67
68    pub fn tooltip_info(&self) -> Option<&str> {
69        None
70    }
71
72    pub fn value(&self) -> i32 {
73        let level_value: &glib::EnumValue = self.to_value().get().expect("it's an enum");
74        level_value.value()
75    }
76
77    pub fn index(&self) -> u8 {
78        match self {
79            UnitDBusLevel::System => 0,
80            UnitDBusLevel::UserSession => 1,
81            UnitDBusLevel::Both => 2,
82        }
83    }
84}
85
86impl From<u8> for UnitDBusLevel {
87    fn from(level: u8) -> Self {
88        match level {
89            0 => UnitDBusLevel::System,
90            1 => UnitDBusLevel::UserSession,
91            2 => UnitDBusLevel::Both,
92            _ => UnitDBusLevel::UserSession,
93        }
94    }
95}
96
97impl From<u32> for UnitDBusLevel {
98    fn from(level: u32) -> Self {
99        (level as u8).into()
100    }
101}
102
103impl From<&str> for UnitDBusLevel {
104    fn from(level: &str) -> Self {
105        match level {
106            "user" => UnitDBusLevel::UserSession,
107            "system" => UnitDBusLevel::System,
108            _ => {
109                warn!("Unit dbus Level not found {level:?}");
110                UnitDBusLevel::default()
111            }
112        }
113    }
114}