mqtt4bytes/packets/
puback.rs1use crate::*;
2use bytes::{Buf, BufMut, Bytes, BytesMut};
3
4#[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, 0x00,
48 0x0A, 0xDE,
50 0xAD,
51 0xBE,
52 0xEF, ];
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}