rumqttc/mqttbytes/v4/
pubrel.rs

1use super::*;
2use bytes::{Buf, BufMut, Bytes, BytesMut};
3
4/// QoS2 Publish release, in response to PUBREC packet
5#[derive(Debug, Clone, PartialEq, Eq)]
6pub struct PubRel {
7    pub pkid: u16,
8}
9
10impl PubRel {
11    pub fn new(pkid: u16) -> PubRel {
12        PubRel { pkid }
13    }
14
15    fn len(&self) -> usize {
16        // pkid
17        2
18    }
19
20    pub fn size(&self) -> usize {
21        let len = self.len();
22        let remaining_len_size = len_len(len);
23
24        1 + remaining_len_size + len
25    }
26
27    pub fn read(fixed_header: FixedHeader, mut bytes: Bytes) -> Result<Self, Error> {
28        let variable_header_index = fixed_header.fixed_header_len;
29        bytes.advance(variable_header_index);
30        let pkid = read_u16(&mut bytes)?;
31        if fixed_header.remaining_len == 2 {
32            return Ok(PubRel { pkid });
33        }
34
35        if fixed_header.remaining_len < 4 {
36            return Ok(PubRel { pkid });
37        }
38
39        let puback = PubRel { pkid };
40
41        Ok(puback)
42    }
43
44    pub fn write(&self, buffer: &mut BytesMut) -> Result<usize, Error> {
45        let len = self.len();
46        buffer.put_u8(0x62);
47        let count = write_remaining_length(buffer, len)?;
48        buffer.put_u16(self.pkid);
49        Ok(1 + count + len)
50    }
51}