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}