embedded_mqtt/fixed_header/
packet_flags.rs

1use core::{
2    convert::{From, TryFrom, TryInto},
3    result::Result,
4    fmt::Debug,
5};
6
7use crate::qos;
8
9use bitfield::BitRange;
10
11#[derive(PartialEq, Eq, Debug, Clone, Copy)]
12pub struct PacketFlags(pub u8);
13
14#[allow(dead_code)]
15impl PacketFlags {
16    pub const CONNECT: PacketFlags = PacketFlags(0b0000);
17    pub const CONNACK: PacketFlags = PacketFlags(0b0000);
18    // publish is special
19    pub const PUBACK: PacketFlags = PacketFlags(0b0000);
20    pub const PUBREC: PacketFlags = PacketFlags(0b0000);
21    pub const PUBREL: PacketFlags = PacketFlags(0b0010);
22    pub const PUBCOMP: PacketFlags = PacketFlags(0b0000);
23    pub const SUBSCRIBE: PacketFlags = PacketFlags(0b0010);
24    pub const SUBACK: PacketFlags = PacketFlags(0b0000);
25    pub const UNSUBSCRIBE: PacketFlags = PacketFlags(0b0010);
26    pub const UNSUBACK: PacketFlags = PacketFlags(0b0000);
27    pub const PINGREQ: PacketFlags = PacketFlags(0b0000);
28    pub const PINGRESP: PacketFlags = PacketFlags(0b0000);
29    pub const DISCONNECT: PacketFlags = PacketFlags(0b0000);
30}
31
32impl From<PublishFlags> for PacketFlags {
33    fn from(flags: PublishFlags) -> Self {
34        PacketFlags(flags.0)
35    }
36}
37
38#[derive(PartialEq, Eq, Clone, Copy, Default)]
39pub struct PublishFlags(u8);
40
41bitfield_bitrange! {
42    struct PublishFlags(u8)
43}
44
45impl PublishFlags {
46    bitfield_fields! {
47        bool;
48        pub dup,    set_dup    : 3;
49        pub retain, set_retain : 0;
50    }
51
52    pub fn qos(&self) -> Result<qos::QoS, qos::Error> {
53        let qos_bits: u8 = self.bit_range(2, 1);
54        qos_bits.try_into()
55    }
56
57    #[allow(dead_code)]
58    pub fn set_qos(&mut self, qos: qos::QoS) {
59        self.set_bit_range(2, 1, u8::from(qos))
60    }
61}
62
63impl Debug for PublishFlags {
64    bitfield_debug! {
65        struct PublishFlags;
66        pub dup, _                : 3;
67        pub into qos::QoS, qos, _ : 2, 1;
68        pub retain, _             : 0;
69    }
70}
71
72impl TryFrom<PacketFlags> for PublishFlags {
73    type Error = qos::Error;
74    fn try_from(flags: PacketFlags) -> Result<Self, Self::Error> {
75        let flags = PublishFlags(flags.0);
76        flags.qos()?;
77        Ok(flags)
78    }
79}