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}