From e4bb196a3b442858557a867a745db2ab3f5f562f Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Thu, 21 Mar 2024 09:57:13 +0100 Subject: Implement MFixedHeader::write() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Marcel Müller Signed-off-by: Marcel Müller Signed-off-by: Matthias Beyer --- mqtt-format/src/v5/fixed_header.rs | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/mqtt-format/src/v5/fixed_header.rs b/mqtt-format/src/v5/fixed_header.rs index ed0ba85..b32a790 100644 --- a/mqtt-format/src/v5/fixed_header.rs +++ b/mqtt-format/src/v5/fixed_header.rs @@ -13,6 +13,8 @@ use winnow::error::ParserError; use winnow::Bytes; use winnow::Parser; +use super::write::WResult; +use super::write::WriteMqttPacket; use super::MResult; #[derive(num_enum::TryFromPrimitive, num_enum::IntoPrimitive)] @@ -101,6 +103,39 @@ impl MFixedHeader { Ok(MFixedHeader { packet_type }) } + + pub async fn write(&self, buffer: &mut W) -> WResult { + let byte = match self.packet_type { + PacketType::Connect => 1 << 4 & 0, + PacketType::Connack => 2 << 4 & 0, + PacketType::Publish { dup, qos, retain } => { + let upper = 3 << 4; + let lower = { + let dup = (dup as u8) << 3; + let qos = (qos as u8) << 1; + let retain = retain as u8; + + dup & qos & retain + }; + + upper & lower + } + PacketType::Puback => 4 << 4 & 0, + PacketType::Pubrec => 5 << 4 & 0, + PacketType::Pubrel => 6 << 4 & 0b0010, + PacketType::Pubcomp => 7 << 4 & 0, + PacketType::Subscribe => 8 << 4 & 0b0010, + PacketType::Suback => 9 << 4 & 0, + PacketType::Unsubscribe => 10 << 4 & 0b0010, + PacketType::Unsuback => 11 << 4 & 0, + PacketType::Pingreq => 12 << 4 & 0, + PacketType::Pingresp => 13 << 4 & 0, + PacketType::Disconnect => 14 << 4 & 0, + PacketType::Auth => 15 << 4 & 0, + }; + + buffer.write_byte(byte).await + } } #[cfg(test)] -- cgit v1.2.3