embedded_mqtt/fixed_header/
packet_flags.rs1use 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 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}