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;
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
28#[cfg(test)]
29mod tests {
30    use super::*;
31    use crate::codec::PacketCodec;
32    use crate::codec::{Decode, Encode};
33    use bytes::BytesMut;
34    use tokio_util::codec::Decoder;
35
36    #[test]
37    fn disconnect_decode() {
38        let mut codec = PacketCodec::new(None, None);
39
40        let data = &[
41            (PacketType::Disconnect as u8) << 4, // Packet type
42            0x00,                                // Remaining len
43        ];
44
45        let mut stream = BytesMut::new();
46
47        stream.extend_from_slice(&data[..]);
48
49        let raw_packet = codec.decode(&mut stream).unwrap().unwrap();
50        let packet = Disconnect::decode(raw_packet).unwrap();
51
52        assert_eq!(packet, Disconnect::default());
53    }
54
55    #[test]
56    fn disconnect_encode() {
57        let packet = Disconnect::default();
58
59        let mut stream = BytesMut::new();
60        packet.encode(&mut stream).unwrap();
61        assert_eq!(stream, vec![(PacketType::Disconnect as u8) << 4, 0x00]);
62    }
63}