mqute_codec/protocol/v5/
packet.rs1use crate::Error;
8use crate::codec::{Decode, Encode, RawPacket};
9use crate::protocol::PacketType;
10use crate::protocol::v5::{
11 Auth, ConnAck, Connect, Disconnect, PingReq, PingResp, PubAck, PubComp, PubRec, PubRel,
12 Publish, SubAck, Subscribe, UnsubAck, Unsubscribe,
13};
14
15#[derive(Debug, Clone, PartialEq, Eq)]
49pub enum Packet {
50 Connect(Connect),
52
53 ConnAck(ConnAck),
55
56 Publish(Publish),
58
59 PubAck(PubAck),
61
62 PubRec(PubRec),
64
65 PubRel(PubRel),
67
68 PubComp(PubComp),
70
71 Subscribe(Subscribe),
73
74 SubAck(SubAck),
76
77 Unsubscribe(Unsubscribe),
79
80 UnsubAck(UnsubAck),
82
83 PingReq(PingReq),
85
86 PingResp(PingResp),
88
89 Disconnect(Disconnect),
91
92 Auth(Auth),
94}
95
96impl Packet {
97 pub fn decode(raw_packet: RawPacket) -> Result<Self, Error> {
105 let packet_type = raw_packet.header.packet_type();
106
107 if raw_packet.header.remaining_len() == 0 {
109 return match packet_type {
110 PacketType::PingReq => Ok(Self::PingReq(PingReq::decode(raw_packet)?)),
111 PacketType::PingResp => Ok(Self::PingResp(PingResp::decode(raw_packet)?)),
112 PacketType::Disconnect => Ok(Self::Disconnect(Disconnect::decode(raw_packet)?)),
113 PacketType::Auth => Ok(Self::Auth(Auth::decode(raw_packet)?)),
114 _ => Err(Error::PayloadRequired),
115 };
116 }
117
118 let decoded = match packet_type {
120 PacketType::Connect => Self::Connect(Connect::decode(raw_packet)?),
121 PacketType::ConnAck => Self::ConnAck(ConnAck::decode(raw_packet)?),
122 PacketType::Publish => Self::Publish(Publish::decode(raw_packet)?),
123 PacketType::PubAck => Self::PubAck(PubAck::decode(raw_packet)?),
124 PacketType::PubRec => Self::PubRec(PubRec::decode(raw_packet)?),
125 PacketType::PubRel => Self::PubRel(PubRel::decode(raw_packet)?),
126 PacketType::PubComp => Self::PubComp(PubComp::decode(raw_packet)?),
127 PacketType::Subscribe => Self::Subscribe(Subscribe::decode(raw_packet)?),
128 PacketType::SubAck => Self::SubAck(SubAck::decode(raw_packet)?),
129 PacketType::Unsubscribe => Self::Unsubscribe(Unsubscribe::decode(raw_packet)?),
130 PacketType::UnsubAck => Self::UnsubAck(UnsubAck::decode(raw_packet)?),
131 PacketType::Disconnect => Self::Disconnect(Disconnect::decode(raw_packet)?),
132 PacketType::Auth => Self::Auth(Auth::decode(raw_packet)?),
133 _ => return Err(Error::MalformedPacket),
135 };
136
137 Ok(decoded)
138 }
139
140 pub fn encode(&self, buf: &mut bytes::BytesMut) -> Result<(), Error> {
145 match self {
146 Self::Connect(packet) => packet.encode(buf),
147 Self::ConnAck(packet) => packet.encode(buf),
148 Self::Publish(packet) => packet.encode(buf),
149 Self::PubAck(packet) => packet.encode(buf),
150 Self::PubRec(packet) => packet.encode(buf),
151 Self::PubRel(packet) => packet.encode(buf),
152 Self::PubComp(packet) => packet.encode(buf),
153 Self::Subscribe(packet) => packet.encode(buf),
154 Self::SubAck(packet) => packet.encode(buf),
155 Self::Unsubscribe(packet) => packet.encode(buf),
156 Self::UnsubAck(packet) => packet.encode(buf),
157 Self::PingReq(packet) => packet.encode(buf),
158 Self::PingResp(packet) => packet.encode(buf),
159 Self::Disconnect(packet) => packet.encode(buf),
160 Self::Auth(packet) => packet.encode(buf),
161 }
162 }
163}
164
165impl From<Connect> for Packet {
166 fn from(value: Connect) -> Self {
167 Self::Connect(value)
168 }
169}
170
171impl From<ConnAck> for Packet {
172 fn from(value: ConnAck) -> Self {
173 Self::ConnAck(value)
174 }
175}
176
177impl From<Publish> for Packet {
178 fn from(value: Publish) -> Self {
179 Self::Publish(value)
180 }
181}
182
183impl From<PubAck> for Packet {
184 fn from(value: PubAck) -> Self {
185 Self::PubAck(value)
186 }
187}
188
189impl From<PubRec> for Packet {
190 fn from(value: PubRec) -> Self {
191 Self::PubRec(value)
192 }
193}
194
195impl From<PubRel> for Packet {
196 fn from(value: PubRel) -> Self {
197 Self::PubRel(value)
198 }
199}
200
201impl From<PubComp> for Packet {
202 fn from(value: PubComp) -> Self {
203 Self::PubComp(value)
204 }
205}
206
207impl From<Subscribe> for Packet {
208 fn from(value: Subscribe) -> Self {
209 Self::Subscribe(value)
210 }
211}
212
213impl From<SubAck> for Packet {
214 fn from(value: SubAck) -> Self {
215 Self::SubAck(value)
216 }
217}
218
219impl From<Unsubscribe> for Packet {
220 fn from(value: Unsubscribe) -> Self {
221 Self::Unsubscribe(value)
222 }
223}
224
225impl From<UnsubAck> for Packet {
226 fn from(value: UnsubAck) -> Self {
227 Self::UnsubAck(value)
228 }
229}
230
231impl From<PingReq> for Packet {
232 fn from(value: PingReq) -> Self {
233 Self::PingReq(value)
234 }
235}
236
237impl From<PingResp> for Packet {
238 fn from(value: PingResp) -> Self {
239 Self::PingResp(value)
240 }
241}
242
243impl From<Disconnect> for Packet {
244 fn from(value: Disconnect) -> Self {
245 Self::Disconnect(value)
246 }
247}
248
249impl From<Auth> for Packet {
250 fn from(value: Auth) -> Self {
251 Self::Auth(value)
252 }
253}