mqtt_codec_kit/common/
qos.rs1#[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#[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}