embedded_mqtt/variable_header/
packet_identifier.rs

1use core::result::Result;
2
3use crate::{
4    fixed_header::PacketFlags,
5    codec::{self, Encodable},
6    status::Status,
7    error::{DecodeError, EncodeError},
8};
9
10use super::{PacketId, HeaderDecode};
11
12// TODO make this a non-zero u16 when it is stable
13#[derive(PartialEq, Debug)]
14pub struct PacketIdentifier(PacketId);
15
16impl PacketIdentifier {
17    pub fn new(packet_identifier: PacketId) -> Self {
18        Self(packet_identifier)
19    }
20
21    pub fn packet_identifier(&self) -> PacketId {
22        self.0
23    }
24}
25
26impl<'buf> HeaderDecode<'buf> for PacketIdentifier {
27    fn decode(_flags: PacketFlags, bytes: &'buf [u8]) -> Result<Status<(usize, Self)>, DecodeError> {
28        // read connack flags
29        let (offset, packet_identifier) = read!(codec::values::parse_u16, bytes, 0);
30
31        Ok(Status::Complete((offset, Self(packet_identifier))))
32    }
33}
34
35impl Encodable for PacketIdentifier {
36    fn encoded_len(&self) -> usize {
37        2
38    }
39
40    fn encode(&self, bytes: &mut [u8]) -> Result<usize, EncodeError> {
41        codec::values::encode_u16(self.0, bytes)
42    }
43}
44
45#[cfg(test)]
46mod tests {
47    
48}