1use bebytes::BeBytes;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, BeBytes)]
7#[bebytes(flags)]
8pub enum ConnectFlags {
9 Reserved = 0x01,
11 CleanStart = 0x02,
13 WillFlag = 0x04,
15 WillQoS0 = 0x08,
17 WillQoS1 = 0x10,
19 WillRetain = 0x20,
21 PasswordFlag = 0x40,
23 UsernameFlag = 0x80,
25}
26
27impl ConnectFlags {
28 #[must_use]
30 pub fn extract_will_qos(flags: u8) -> u8 {
31 (flags >> crate::constants::connect_flags::WILL_QOS_SHIFT)
32 & crate::constants::connect_flags::WILL_QOS_MASK
33 }
34
35 #[must_use]
36 pub fn with_will_qos(mut flags: u8, qos: u8) -> u8 {
38 flags &= crate::constants::connect_flags::WILL_QOS_CLEAR_MASK;
40 flags |= (qos & crate::constants::connect_flags::WILL_QOS_MASK)
42 << crate::constants::connect_flags::WILL_QOS_SHIFT;
43 flags
44 }
45}
46
47#[derive(Debug, Clone, Copy, PartialEq, Eq, BeBytes)]
49#[bebytes(flags)]
50pub enum PublishFlags {
51 Retain = 0x01,
53 QoS0 = 0x02,
55 QoS1 = 0x04,
57 Dup = 0x08,
59}
60
61impl PublishFlags {
62 #[must_use]
64 pub fn extract_qos(flags: u8) -> u8 {
65 (flags >> crate::constants::publish_flags::QOS_SHIFT)
66 & crate::constants::publish_flags::QOS_MASK
67 }
68
69 #[must_use]
70 pub fn with_qos(mut flags: u8, qos: u8) -> u8 {
72 flags &= crate::constants::publish_flags::QOS_CLEAR_MASK;
74 flags |= (qos & crate::constants::publish_flags::QOS_MASK)
76 << crate::constants::publish_flags::QOS_SHIFT;
77 flags
78 }
79}
80
81#[derive(Debug, Clone, Copy, PartialEq, Eq, BeBytes)]
83#[bebytes(flags)]
84pub enum ConnAckFlags {
85 SessionPresent = 0x01,
87}
88
89#[cfg(test)]
90mod tests {
91 use super::*;
92
93 #[test]
94 fn test_connect_flags_decompose() {
95 let flags: u8 = 0xC2; let decomposed = ConnectFlags::decompose(flags);
98
99 assert_eq!(decomposed.len(), 3);
100 assert!(decomposed.contains(&ConnectFlags::CleanStart));
101 assert!(decomposed.contains(&ConnectFlags::UsernameFlag));
102 assert!(decomposed.contains(&ConnectFlags::PasswordFlag));
103 }
104
105 #[test]
106 fn test_publish_flags_decompose() {
107 let flags: u8 = 0x0D;
109 let decomposed = PublishFlags::decompose(flags);
110
111 assert!(decomposed.contains(&PublishFlags::Retain));
112 assert!(decomposed.contains(&PublishFlags::QoS1)); assert!(decomposed.contains(&PublishFlags::Dup));
114
115 assert_eq!(PublishFlags::extract_qos(flags), 2);
117 }
118
119 #[test]
120 fn test_connack_flags() {
121 let flags: u8 = 0x01;
122 let decomposed = ConnAckFlags::decompose(flags);
123
124 assert_eq!(decomposed.len(), 1);
125 assert!(decomposed.contains(&ConnAckFlags::SessionPresent));
126 }
127
128 #[test]
129 fn test_flag_iteration() {
130 let flags: u8 = 0x0D; let collected: Vec<_> = PublishFlags::iter_flags(flags).collect();
133 assert_eq!(collected.len(), 3);
134 }
135}