mqute_codec/protocol/v4/
disconnect.rs

1//! # Disconnect Packet V4
2//!
3//! This module defines the `Disconnect` packet, which is used in the MQTT protocol to indicate
4//! that the client or server is disconnecting from the session. The `Disconnect` packet has no
5//! payload and is represented by a simple struct.
6
7use super::util;
8use crate::protocol::{PacketType, traits};
9
10/// Represents an MQTT `Disconnect` packet.
11///
12/// # Example
13///
14/// ```rust
15/// use mqute_codec::protocol::v4::Disconnect;
16///
17/// let packet = Disconnect { };
18/// ```
19#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
20pub struct Disconnect {}
21
22// Implement the `Decode` trait for `Disconnect`.
23util::header_packet_decode_impl!(Disconnect, PacketType::Disconnect);
24
25// Implement the `Encode` trait for `Disconnect`.
26util::header_packet_encode_impl!(Disconnect, PacketType::Disconnect);
27
28impl traits::Disconnect for Disconnect {}
29
30#[cfg(test)]
31mod tests {
32    use super::*;
33    use crate::codec::PacketCodec;
34    use crate::codec::{Decode, Encode};
35    use bytes::BytesMut;
36    use tokio_util::codec::Decoder;
37
38    #[test]
39    fn disconnect_decode() {
40        let mut codec = PacketCodec::new(None, None);
41
42        let data = &[
43            (PacketType::Disconnect as u8) << 4, // Packet type
44            0x00,                                // Remaining len
45        ];
46
47        let mut stream = BytesMut::new();
48
49        stream.extend_from_slice(&data[..]);
50
51        let raw_packet = codec.decode(&mut stream).unwrap().unwrap();
52        let packet = Disconnect::decode(raw_packet).unwrap();
53
54        assert_eq!(packet, Disconnect::default());
55    }
56
57    #[test]
58    fn disconnect_encode() {
59        let packet = Disconnect::default();
60
61        let mut stream = BytesMut::new();
62        packet.encode(&mut stream).unwrap();
63        assert_eq!(stream, vec![(PacketType::Disconnect as u8) << 4, 0x00]);
64    }
65}