mqtt_packet/
packet_type.rs

1use crate::build_enum;
2use crate::DataType;
3use crate::Error;
4use std::convert::TryFrom;
5use std::io;
6
7build_enum!(
8  PacketType {
9    CONNECT = 1,
10    CONNACK = 2,
11    PUBLISH = 3,
12    PUBACK = 4,
13    PUBREC = 5,
14    PUBREL = 6,
15    PUBCOMP = 7,
16    SUBSCRIBE = 8,
17    SUBACK = 9,
18    UNSUBSCRIBE = 10,
19    UNSUBACK = 11,
20    PINGREQ = 12,
21    PINGRESP = 13,
22    DISCONNECT = 14,
23    AUTH = 15
24  }
25);
26
27/// [2.1.2 MQTT Control Packet type](https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901022)
28///
29/// Position: byte 1, bits 7-4.
30/// Represented as a 4-bit unsigned value.
31impl PacketType {
32  /// Parse property values from a reader into DataType variants.
33  ///
34  /// # Examples
35  /// ```rust
36  /// use mqtt_packet::PacketType;
37  /// use mqtt_packet::Error;
38  /// use std::io;
39  ///
40  /// let bytes: Vec<u8> = vec![0x10];
41  /// let mut reader = io::BufReader::new(&bytes[..]);
42  ///
43  /// let packet_type = PacketType::new(&mut reader).unwrap();
44  /// assert_eq!(packet_type, PacketType::CONNECT);
45  /// ```
46  ///
47  /// Error:
48  ///
49  /// ```rust
50  /// use mqtt_packet::PacketType;
51  /// use mqtt_packet::Error;
52  /// use std::io;
53  ///
54  /// let err_bytes: Vec<u8> = vec![0x00];
55  /// let mut err_reader = io::BufReader::new(&err_bytes[..]);
56  ///
57  /// let err = PacketType::new(&mut err_reader).unwrap_err();
58  /// assert_eq!(err, Error::GenerateError)
59  /// ```
60  pub fn new<R: io::Read>(reader: &mut R) -> Result<Self, Error> {
61    let byte = DataType::parse_byte(reader)?;
62    if let DataType::Byte(value) = byte {
63      let type_number: u8 = (value & 0xF0) >> 4;
64      return Ok(PacketType::try_from(type_number)?);
65    } else {
66      return Err(Error::ParseError);
67    }
68  }
69}