rusmpp_core/values/
priority_flag.rs

1use rusmpp_macros::Rusmpp;
2
3/// See [`PriorityFlagType`].
4#[derive(Default, Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Rusmpp)]
5#[rusmpp(repr = "u8")]
6#[cfg_attr(feature = "arbitrary", derive(::arbitrary::Arbitrary))]
7#[cfg_attr(feature = "serde", derive(::serde::Serialize))]
8#[cfg_attr(feature = "serde-deserialize-unchecked", derive(::serde::Deserialize))]
9pub struct PriorityFlag {
10    pub value: u8,
11}
12
13impl PriorityFlag {
14    pub fn new(value: u8) -> Self {
15        Self { value }
16    }
17}
18
19impl From<PriorityFlagType> for PriorityFlag {
20    fn from(value: PriorityFlagType) -> Self {
21        Self {
22            value: value.into(),
23        }
24    }
25}
26
27impl From<u8> for PriorityFlag {
28    fn from(value: u8) -> Self {
29        Self { value }
30    }
31}
32
33impl From<PriorityFlag> for u8 {
34    fn from(value: PriorityFlag) -> Self {
35        value.value
36    }
37}
38
39impl From<GsmSms> for PriorityFlag {
40    fn from(value: GsmSms) -> Self {
41        Self {
42            value: value.into(),
43        }
44    }
45}
46
47impl From<GsmCbs> for PriorityFlag {
48    fn from(value: GsmCbs) -> Self {
49        Self {
50            value: value.into(),
51        }
52    }
53}
54
55impl From<Ansi136> for PriorityFlag {
56    fn from(value: Ansi136) -> Self {
57        Self {
58            value: value.into(),
59        }
60    }
61}
62
63impl From<Is95> for PriorityFlag {
64    fn from(value: Is95) -> Self {
65        Self {
66            value: value.into(),
67        }
68    }
69}
70
71impl From<Ansi41Cbs> for PriorityFlag {
72    fn from(value: Ansi41Cbs) -> Self {
73        Self {
74            value: value.into(),
75        }
76    }
77}
78
79/// Helper for creating a priority_flag.
80///
81/// A priority flag type can not be created from u8.
82/// Depending on the variant you want to create, you need to use the variant itself.
83///
84/// # Example
85///
86/// ```rust
87/// use rusmpp_core::values::{GsmSms, PriorityFlag, PriorityFlagType};
88///
89/// let gsm_sms = GsmSms::from(1);
90/// assert_eq!(gsm_sms, GsmSms::Priority1);
91///
92/// let priority_flag_type = PriorityFlagType::from(gsm_sms);
93/// assert!(matches!(priority_flag_type, PriorityFlagType::GsmSms(GsmSms::Priority1)));
94///
95/// let priority_flag = PriorityFlag::from(priority_flag_type);
96/// assert_eq!(priority_flag, PriorityFlag::new(1));
97///
98/// let priority_flag: PriorityFlag = GsmSms::from(1).into();
99/// assert_eq!(priority_flag, PriorityFlag::new(1));
100/// ```
101#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
102pub enum PriorityFlagType {
103    GsmSms(GsmSms),
104    GsmCbs(GsmCbs),
105    Ansi136(Ansi136),
106    Is95(Is95),
107    Ansi41Cbs(Ansi41Cbs),
108}
109
110impl From<PriorityFlagType> for u8 {
111    fn from(value: PriorityFlagType) -> Self {
112        match value {
113            PriorityFlagType::GsmSms(value) => value.into(),
114            PriorityFlagType::GsmCbs(value) => value.into(),
115            PriorityFlagType::Ansi136(value) => value.into(),
116            PriorityFlagType::Is95(value) => value.into(),
117            PriorityFlagType::Ansi41Cbs(value) => value.into(),
118        }
119    }
120}
121
122#[repr(u8)]
123#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Default)]
124pub enum GsmSms {
125    #[default]
126    None = 0,
127    Priority1 = 1,
128    Priority2 = 2,
129    Priority3 = 3,
130}
131
132impl From<u8> for GsmSms {
133    fn from(value: u8) -> Self {
134        match value {
135            0 => GsmSms::None,
136            1 => GsmSms::Priority1,
137            2 => GsmSms::Priority2,
138            3 => GsmSms::Priority3,
139            _ => GsmSms::None,
140        }
141    }
142}
143
144impl From<GsmSms> for u8 {
145    fn from(value: GsmSms) -> Self {
146        match value {
147            GsmSms::None => 0,
148            GsmSms::Priority1 => 1,
149            GsmSms::Priority2 => 2,
150            GsmSms::Priority3 => 3,
151        }
152    }
153}
154
155impl From<GsmSms> for PriorityFlagType {
156    fn from(value: GsmSms) -> Self {
157        PriorityFlagType::GsmSms(value)
158    }
159}
160
161#[repr(u8)]
162#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Default)]
163pub enum GsmCbs {
164    #[default]
165    Normal = 0,
166    ImmediateBroadcast = 1,
167    HighPriority = 2,
168    Reserved = 3,
169    PriorityBackground = 4,
170}
171
172impl From<u8> for GsmCbs {
173    fn from(value: u8) -> Self {
174        match value {
175            0 => GsmCbs::Normal,
176            1 => GsmCbs::ImmediateBroadcast,
177            2 => GsmCbs::HighPriority,
178            3 => GsmCbs::Reserved,
179            4 => GsmCbs::PriorityBackground,
180            _ => GsmCbs::Normal,
181        }
182    }
183}
184
185impl From<GsmCbs> for u8 {
186    fn from(value: GsmCbs) -> Self {
187        match value {
188            GsmCbs::Normal => 0,
189            GsmCbs::ImmediateBroadcast => 1,
190            GsmCbs::HighPriority => 2,
191            GsmCbs::Reserved => 3,
192            GsmCbs::PriorityBackground => 4,
193        }
194    }
195}
196
197impl From<GsmCbs> for PriorityFlagType {
198    fn from(value: GsmCbs) -> Self {
199        PriorityFlagType::GsmCbs(value)
200    }
201}
202
203#[repr(u8)]
204#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Default)]
205pub enum Ansi136 {
206    #[default]
207    Bulk = 0,
208    Normal = 1,
209    Urgent = 2,
210    VeryUrgent = 3,
211}
212
213impl From<u8> for Ansi136 {
214    fn from(value: u8) -> Self {
215        match value {
216            0 => Ansi136::Bulk,
217            1 => Ansi136::Normal,
218            2 => Ansi136::Urgent,
219            3 => Ansi136::VeryUrgent,
220            _ => Ansi136::Normal,
221        }
222    }
223}
224
225impl From<Ansi136> for u8 {
226    fn from(value: Ansi136) -> Self {
227        match value {
228            Ansi136::Bulk => 0,
229            Ansi136::Normal => 1,
230            Ansi136::Urgent => 2,
231            Ansi136::VeryUrgent => 3,
232        }
233    }
234}
235
236impl From<Ansi136> for PriorityFlagType {
237    fn from(value: Ansi136) -> Self {
238        PriorityFlagType::Ansi136(value)
239    }
240}
241
242#[repr(u8)]
243#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Default)]
244pub enum Is95 {
245    #[default]
246    Normal = 0,
247    Interactive = 1,
248    Urgent = 2,
249    Emergency = 3,
250}
251
252impl From<u8> for Is95 {
253    fn from(value: u8) -> Self {
254        match value {
255            0 => Is95::Normal,
256            1 => Is95::Interactive,
257            2 => Is95::Urgent,
258            3 => Is95::Emergency,
259            _ => Is95::Normal,
260        }
261    }
262}
263
264impl From<Is95> for u8 {
265    fn from(value: Is95) -> Self {
266        match value {
267            Is95::Normal => 0,
268            Is95::Interactive => 1,
269            Is95::Urgent => 2,
270            Is95::Emergency => 3,
271        }
272    }
273}
274
275impl From<Is95> for PriorityFlagType {
276    fn from(value: Is95) -> Self {
277        PriorityFlagType::Is95(value)
278    }
279}
280
281#[repr(u8)]
282#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Default)]
283pub enum Ansi41Cbs {
284    #[default]
285    Normal = 0,
286    Interactive = 1,
287    Urgent = 2,
288    Emergency = 3,
289}
290
291impl From<u8> for Ansi41Cbs {
292    fn from(value: u8) -> Self {
293        match value {
294            0 => Ansi41Cbs::Normal,
295            1 => Ansi41Cbs::Interactive,
296            2 => Ansi41Cbs::Urgent,
297            3 => Ansi41Cbs::Emergency,
298            _ => Ansi41Cbs::Normal,
299        }
300    }
301}
302
303impl From<Ansi41Cbs> for u8 {
304    fn from(value: Ansi41Cbs) -> Self {
305        match value {
306            Ansi41Cbs::Normal => 0,
307            Ansi41Cbs::Interactive => 1,
308            Ansi41Cbs::Urgent => 2,
309            Ansi41Cbs::Emergency => 3,
310        }
311    }
312}
313
314impl From<Ansi41Cbs> for PriorityFlagType {
315    fn from(value: Ansi41Cbs) -> Self {
316        PriorityFlagType::Ansi41Cbs(value)
317    }
318}
319
320#[cfg(test)]
321mod tests {
322    use super::*;
323
324    #[test]
325    fn gsm_sms() {
326        let gsm_sms = GsmSms::from(0);
327        assert_eq!(gsm_sms, GsmSms::None);
328
329        let gsm_sms = GsmSms::from(1);
330        assert_eq!(gsm_sms, GsmSms::Priority1);
331
332        let gsm_sms = GsmSms::from(2);
333        assert_eq!(gsm_sms, GsmSms::Priority2);
334
335        let gsm_sms = GsmSms::from(3);
336        assert_eq!(gsm_sms, GsmSms::Priority3);
337
338        let gsm_sms = GsmSms::from(4);
339        assert_eq!(gsm_sms, GsmSms::None);
340    }
341
342    #[test]
343    fn encode_decode() {
344        #[cfg(feature = "alloc")]
345        crate::tests::owned::encode_decode_test_instances::<PriorityFlag>();
346        crate::tests::borrowed::encode_decode_test_instances::<PriorityFlag>();
347    }
348}