rumq_core/mqtt4/
mod.rs

1mod asyncdeserialize;
2mod asyncserialize;
3mod deserialize;
4mod packets;
5mod serialize;
6mod topic;
7
8pub mod codec;
9
10pub use asyncdeserialize::AsyncMqttRead;
11pub use asyncserialize::AsyncMqttWrite;
12pub use deserialize::MqttRead;
13pub use packets::*;
14pub use serialize::MqttWrite;
15pub use topic::*;
16
17use crate::Error;
18
19/// Quality of service
20#[repr(u8)]
21#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd)]
22pub enum QoS {
23    AtMostOnce = 0,
24    AtLeastOnce = 1,
25    ExactlyOnce = 2,
26}
27
28#[repr(u8)]
29#[derive(Debug, Clone, Copy, PartialEq, Eq)]
30enum PacketType {
31    Connect = 1,
32    Connack,
33    Publish,
34    Puback,
35    Pubrec,
36    Pubrel,
37    Pubcomp,
38    Subscribe,
39    Suback,
40    Unsubscribe,
41    Unsuback,
42    Pingreq,
43    Pingresp,
44    Disconnect,
45}
46
47/// Encapsulates all the possible mqtt packets
48#[derive(Debug, Clone, PartialEq)]
49pub enum Packet {
50    Connect(Connect),
51    Connack(Connack),
52    Publish(Publish),
53    Puback(PacketIdentifier),
54    Pubrec(PacketIdentifier),
55    Pubrel(PacketIdentifier),
56    Pubcomp(PacketIdentifier),
57    Subscribe(Subscribe),
58    Suback(Suback),
59    Unsubscribe(Unsubscribe),
60    Unsuback(PacketIdentifier),
61    Pingreq,
62    Pingresp,
63    Disconnect,
64}
65
66//          7                          3                          0
67//          +--------------------------+--------------------------+
68// byte 1   | MQTT Control Packet Type | Flags for each type      |
69//          +--------------------------+--------------------------+
70//          |         Remaining Bytes Len  (1 - 4 bytes)          |
71//          +-----------------------------------------------------+
72//
73// http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Figure_2.2_-
74
75fn qos(num: u8) -> Result<QoS, Error> {
76    match num {
77        0 => Ok(QoS::AtMostOnce),
78        1 => Ok(QoS::AtLeastOnce),
79        2 => Ok(QoS::ExactlyOnce),
80        _ => Err(Error::UnsupportedQoS),
81    }
82}
83
84fn packet_type(num: u8) -> Result<PacketType, Error> {
85    match num {
86        1 => Ok(PacketType::Connect),
87        2 => Ok(PacketType::Connack),
88        3 => Ok(PacketType::Publish),
89        4 => Ok(PacketType::Puback),
90        5 => Ok(PacketType::Pubrec),
91        6 => Ok(PacketType::Pubrel),
92        7 => Ok(PacketType::Pubcomp),
93        8 => Ok(PacketType::Subscribe),
94        9 => Ok(PacketType::Suback),
95        10 => Ok(PacketType::Unsubscribe),
96        11 => Ok(PacketType::Unsuback),
97        12 => Ok(PacketType::Pingreq),
98        13 => Ok(PacketType::Pingresp),
99        14 => Ok(PacketType::Disconnect),
100        _ => Err(Error::UnsupportedPacketType(num)),
101    }
102}
103
104fn connect_return(num: u8) -> Result<ConnectReturnCode, Error> {
105    match num {
106        0 => Ok(ConnectReturnCode::Accepted),
107        1 => Ok(ConnectReturnCode::BadUsernamePassword),
108        2 => Ok(ConnectReturnCode::NotAuthorized),
109        3 => Ok(ConnectReturnCode::RefusedIdentifierRejected),
110        4 => Ok(ConnectReturnCode::RefusedProtocolVersion),
111        5 => Ok(ConnectReturnCode::ServerUnavailable),
112        _ => Err(Error::InvalidConnectReturnCode(num)),
113    }
114}