mqute_codec/protocol/v4/
suback.rs1use crate::Error;
7use crate::protocol::common::suback;
8use crate::protocol::{QoS, traits};
9
10#[derive(Debug, Clone, Copy, PartialEq, Eq)]
12pub enum ReturnCode {
13 Success(QoS),
15
16 Failure,
18}
19
20impl TryFrom<u8> for ReturnCode {
21 type Error = Error;
22
23 fn try_from(value: u8) -> Result<Self, Self::Error> {
25 let code = match value {
26 0x0 => ReturnCode::Success(QoS::AtMostOnce),
27 0x1 => ReturnCode::Success(QoS::AtLeastOnce),
28 0x2 => ReturnCode::Success(QoS::ExactlyOnce),
29 0x80 => ReturnCode::Failure,
30 _ => return Err(Error::InvalidReasonCode(value)),
31 };
32
33 Ok(code)
34 }
35}
36
37impl From<ReturnCode> for u8 {
38 fn from(value: ReturnCode) -> Self {
40 match value {
41 ReturnCode::Success(qos) => qos as u8,
42 ReturnCode::Failure => 0x80,
43 }
44 }
45}
46
47suback!(ReturnCode);
49
50impl traits::SubAck for SubAck {}
51
52#[cfg(test)]
53mod tests {
54 use super::*;
55 use crate::codec::{Decode, Encode, PacketCodec};
56 use crate::protocol::PacketType;
57 use bytes::BytesMut;
58 use tokio_util::codec::Decoder;
59
60 #[test]
61 fn suback_decode() {
62 let mut codec = PacketCodec::new(None, None);
63
64 let data = &[
65 (PacketType::SubAck as u8) << 4, 0x04, 0x12, 0x34,
69 0x02, 0x80, ];
72
73 let mut stream = BytesMut::new();
74
75 stream.extend_from_slice(&data[..]);
76
77 let raw_packet = codec.decode(&mut stream).unwrap().unwrap();
78 let packet = SubAck::decode(raw_packet).unwrap();
79
80 assert_eq!(
81 packet,
82 SubAck::new(
83 0x1234,
84 vec![ReturnCode::Success(QoS::ExactlyOnce), ReturnCode::Failure]
85 )
86 );
87 }
88
89 #[test]
90 fn suback_encode() {
91 let packet = SubAck::new(
92 0x1234,
93 vec![ReturnCode::Success(QoS::ExactlyOnce), ReturnCode::Failure],
94 );
95
96 let mut stream = BytesMut::new();
97 packet.encode(&mut stream).unwrap();
98 assert_eq!(
99 stream,
100 vec![
101 (PacketType::SubAck as u8) << 4,
102 0x04,
103 0x12,
104 0x34,
105 0x02,
106 0x80
107 ]
108 );
109 }
110}