Skip to main content

mqtt4bytes/packets/
puback.rs

1use crate::*;
2use bytes::{Buf, BufMut, Bytes, BytesMut};
3
4/// Acknowledgement to QoS1 publish
5#[derive(Debug, Clone, PartialEq)]
6pub struct PubAck {
7    pub pkid: u16,
8}
9
10impl PubAck {
11    pub fn new(pkid: u16) -> PubAck {
12        PubAck { pkid }
13    }
14
15    pub(crate) fn assemble(fixed_header: FixedHeader, mut bytes: Bytes) -> Result<Self, Error> {
16        if fixed_header.remaining_len != 2 {
17            return Err(Error::PayloadSizeIncorrect);
18        }
19
20        let variable_header_index = fixed_header.fixed_len;
21        bytes.advance(variable_header_index);
22        let pkid = bytes.get_u16();
23        let puback = PubAck { pkid };
24
25        Ok(puback)
26    }
27
28    pub fn write(&self, buffer: &mut BytesMut) -> Result<usize, Error> {
29        let o: &[u8] = &[0x40, 0x02];
30        buffer.put_slice(o);
31        buffer.put_u16(self.pkid);
32        Ok(4)
33    }
34}
35
36#[cfg(test)]
37mod test {
38    use super::*;
39    use bytes::BytesMut;
40    use pretty_assertions::assert_eq;
41
42    #[test]
43    fn puback_stitching_works_correctly() {
44        let stream = &[
45            0b0100_0000,
46            0x02, // packet type, flags and remaining len
47            0x00,
48            0x0A, // fixed header. packet identifier = 10
49            0xDE,
50            0xAD,
51            0xBE,
52            0xEF, // extra packets in the stream
53        ];
54        let mut stream = BytesMut::from(&stream[..]);
55
56        let packet = mqtt_read(&mut stream, 100).unwrap();
57        let packet = match packet {
58            Packet::PubAck(packet) => packet,
59            packet => panic!("Invalid packet = {:?}", packet),
60        };
61
62        assert_eq!(packet, PubAck { pkid: 10 });
63    }
64}