mqute_codec/codec/
decode.rs

1//! # Decode Trait
2//!
3//! This module defines the `Decode` trait, which provides a common interface for decoding
4//! MQTT packets from their raw representation (`RawPacket`).
5//!
6//! The `Decode` trait is implemented by types that can be decoded from a raw MQTT packet.
7
8use super::RawPacket;
9use crate::Error;
10
11/// A trait for decoding MQTT packets from their raw representation.
12///
13/// Types that implement this trait can be decoded from a `RawPacket`. This is useful for
14/// deserializing MQTT packets received over the network.
15pub trait Decode: Sized {
16    /// Decodes a raw MQTT packet into the implementing type.
17    ///
18    /// # Examples
19    ///
20    /// ```rust
21    /// use mqute_codec::protocol::{FixedHeader, PacketType};
22    /// use mqute_codec::codec::{Decode, RawPacket};
23    /// use mqute_codec::Error;
24    /// use bytes::Bytes;
25    ///
26    ///
27    /// struct Packet {
28    ///     header: FixedHeader,
29    ///     payload: Vec<u8>,
30    /// }
31    ///
32    /// impl Decode for Packet {
33    ///     fn decode(packet: RawPacket) -> Result<Self, Error> {
34    ///         let header = packet.header;
35    ///         let payload = packet.payload.to_vec();
36    ///         Ok(Packet { header, payload })
37    ///     }
38    /// }
39    ///
40    /// let header = FixedHeader::new(PacketType::Connect, 2);
41    /// let raw_packet = RawPacket::new(header.clone(), Bytes::copy_from_slice(&[0x00, 0x01])); // Example raw packet
42    /// let packet = Packet::decode(raw_packet).unwrap();
43    /// assert_eq!(packet.header, header);
44    /// assert_eq!(packet.payload, vec![0x00, 0x01]);
45    /// ```
46    fn decode(packet: RawPacket) -> Result<Self, Error>;
47}