use bebytes::BeBytes;
#[derive(Debug, Clone, Copy, PartialEq, Eq, BeBytes)]
#[bebytes(flags)]
pub enum ConnectFlags {
Reserved = 0x01,
CleanStart = 0x02,
WillFlag = 0x04,
WillQoS0 = 0x08,
WillQoS1 = 0x10,
WillRetain = 0x20,
PasswordFlag = 0x40,
UsernameFlag = 0x80,
}
impl ConnectFlags {
#[must_use]
pub fn extract_will_qos(flags: u8) -> u8 {
(flags >> crate::constants::connect_flags::WILL_QOS_SHIFT)
& crate::constants::connect_flags::WILL_QOS_MASK
}
#[must_use]
pub fn with_will_qos(mut flags: u8, qos: u8) -> u8 {
flags &= crate::constants::connect_flags::WILL_QOS_CLEAR_MASK;
flags |= (qos & crate::constants::connect_flags::WILL_QOS_MASK)
<< crate::constants::connect_flags::WILL_QOS_SHIFT;
flags
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, BeBytes)]
#[bebytes(flags)]
pub enum PublishFlags {
Retain = 0x01,
QoS0 = 0x02,
QoS1 = 0x04,
Dup = 0x08,
}
impl PublishFlags {
#[must_use]
pub fn extract_qos(flags: u8) -> u8 {
(flags >> crate::constants::publish_flags::QOS_SHIFT)
& crate::constants::publish_flags::QOS_MASK
}
#[must_use]
pub fn with_qos(mut flags: u8, qos: u8) -> u8 {
flags &= crate::constants::publish_flags::QOS_CLEAR_MASK;
flags |= (qos & crate::constants::publish_flags::QOS_MASK)
<< crate::constants::publish_flags::QOS_SHIFT;
flags
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, BeBytes)]
#[bebytes(flags)]
pub enum ConnAckFlags {
SessionPresent = 0x01,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_connect_flags_decompose() {
let flags: u8 = 0xC2; let decomposed = ConnectFlags::decompose(flags);
assert_eq!(decomposed.len(), 3);
assert!(decomposed.contains(&ConnectFlags::CleanStart));
assert!(decomposed.contains(&ConnectFlags::UsernameFlag));
assert!(decomposed.contains(&ConnectFlags::PasswordFlag));
}
#[test]
fn test_publish_flags_decompose() {
let flags: u8 = 0x0D;
let decomposed = PublishFlags::decompose(flags);
assert!(decomposed.contains(&PublishFlags::Retain));
assert!(decomposed.contains(&PublishFlags::QoS1)); assert!(decomposed.contains(&PublishFlags::Dup));
assert_eq!(PublishFlags::extract_qos(flags), 2);
}
#[test]
fn test_connack_flags() {
let flags: u8 = 0x01;
let decomposed = ConnAckFlags::decompose(flags);
assert_eq!(decomposed.len(), 1);
assert!(decomposed.contains(&ConnAckFlags::SessionPresent));
}
#[test]
fn test_flag_iteration() {
let flags: u8 = 0x0D;
let collected: Vec<_> = PublishFlags::iter_flags(flags).collect();
assert_eq!(collected.len(), 3);
}
}