mqtt_codec_kit/common/
qos.rs

1//! QoS (Quality of Services)
2
3#[repr(u8)]
4#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Copy, Clone)]
5pub enum QualityOfService {
6    Level0 = 0,
7    Level1 = 1,
8    Level2 = 2,
9}
10
11impl From<QoSWithPacketIdentifier> for QualityOfService {
12    fn from(qos: QoSWithPacketIdentifier) -> Self {
13        match qos {
14            QoSWithPacketIdentifier::Level0 => QualityOfService::Level0,
15            QoSWithPacketIdentifier::Level1(_) => QualityOfService::Level1,
16            QoSWithPacketIdentifier::Level2(_) => QualityOfService::Level2,
17        }
18    }
19}
20
21/// QoS with identifier pairs
22#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Copy, Clone)]
23pub enum QoSWithPacketIdentifier {
24    Level0,
25    Level1(u16),
26    Level2(u16),
27}
28
29impl QoSWithPacketIdentifier {
30    pub fn new(qos: QualityOfService, id: u16) -> QoSWithPacketIdentifier {
31        match (qos, id) {
32            (QualityOfService::Level0, _) => QoSWithPacketIdentifier::Level0,
33            (QualityOfService::Level1, id) => QoSWithPacketIdentifier::Level1(id),
34            (QualityOfService::Level2, id) => QoSWithPacketIdentifier::Level2(id),
35        }
36    }
37
38    pub fn split(self) -> (QualityOfService, Option<u16>) {
39        match self {
40            QoSWithPacketIdentifier::Level0 => (QualityOfService::Level0, None),
41            QoSWithPacketIdentifier::Level1(pkid) => (QualityOfService::Level1, Some(pkid)),
42            QoSWithPacketIdentifier::Level2(pkid) => (QualityOfService::Level2, Some(pkid)),
43        }
44    }
45}
46
47#[cfg(test)]
48mod test {
49    use super::*;
50    use std::cmp::min;
51
52    #[test]
53    fn min_qos() {
54        let q1 = QoSWithPacketIdentifier::Level1(0).into();
55        let q2 = QualityOfService::Level2;
56        assert_eq!(min(q1, q2), q1);
57
58        let q1 = QoSWithPacketIdentifier::Level0.into();
59        let q2 = QualityOfService::Level2;
60        assert_eq!(min(q1, q2), q1);
61
62        let q1 = QoSWithPacketIdentifier::Level2(0).into();
63        let q2 = QualityOfService::Level1;
64        assert_eq!(min(q1, q2), q2);
65    }
66}