sage_mqtt/codec/
reason_code.rs

1use crate::{codec, ReasonCode, Result as SageResult};
2use std::marker::Unpin;
3use tokio::io::AsyncWrite;
4
5///Write the given `ReasonCode`in one byte, returning `1` in case of success.
6pub async fn write_reason_code<W: AsyncWrite + Unpin>(
7    code: ReasonCode,
8    writer: &mut W,
9) -> SageResult<usize> {
10    codec::write_byte(
11        match code {
12            ReasonCode::Success => 0x00,
13            ReasonCode::GrantedQoS1 => 0x01,
14            ReasonCode::GrantedQoS2 => 0x02,
15            ReasonCode::DisconnectWithWillMessage => 0x04,
16            ReasonCode::NoMatchingSubscribers => 0x10,
17            ReasonCode::NoSubscriptionExisted => 0x11,
18            ReasonCode::ContinueAuthentication => 0x18,
19            ReasonCode::ReAuthenticate => 0x19,
20            ReasonCode::UnspecifiedError => 0x80,
21            ReasonCode::MalformedPacket => 0x81,
22            ReasonCode::ProtocolError => 0x82,
23            ReasonCode::ImplementationSpecificError => 0x83,
24            ReasonCode::UnsupportedProtocolVersion => 0x84,
25            ReasonCode::ClientIdentifierNotValid => 0x85,
26            ReasonCode::BadUserNameOrPassword => 0x86,
27            ReasonCode::NotAuthorized => 0x87,
28            ReasonCode::ServerUnavailable => 0x88,
29            ReasonCode::ServerBusy => 0x89,
30            ReasonCode::Banned => 0x8A,
31            ReasonCode::ServerShuttingDown => 0x8B,
32            ReasonCode::BadAuthenticationMethod => 0x8C,
33            ReasonCode::KeepAliveTimeout => 0x8D,
34            ReasonCode::SessionTakenOver => 0x8E,
35            ReasonCode::TopicFilterInvalid => 0x8F,
36            ReasonCode::TopicNameInvalid => 0x90,
37            ReasonCode::PacketIdentifierInUse => 0x91,
38            ReasonCode::PacketIdentifierNotFound => 0x92,
39            ReasonCode::ReceiveMaximumExceeded => 0x93,
40            ReasonCode::TopicAliasInvalid => 0x94,
41            ReasonCode::PacketTooLarge => 0x95,
42            ReasonCode::MessageRateTooHigh => 0x96,
43            ReasonCode::QuotaExceeded => 0x97,
44            ReasonCode::AdministrativeAction => 0x98,
45            ReasonCode::PayloadFormatInvalid => 0x99,
46            ReasonCode::RetainNotSupported => 0x9A,
47            ReasonCode::QoSNotSupported => 0x9B,
48            ReasonCode::UseAnotherServer => 0x9C,
49            ReasonCode::ServerMoved => 0x9D,
50            ReasonCode::SharedSubscriptionsNotSupported => 0x9E,
51            ReasonCode::ConnectionRateExceeded => 0x9F,
52            ReasonCode::MaximumConnectTime => 0xA0,
53            ReasonCode::SubscriptionIdentifiersNotSupported => 0xA1,
54            ReasonCode::WildcardSubscriptionsNotSupported => 0xA2,
55        },
56        writer,
57    )
58    .await
59}
60
61#[cfg(test)]
62mod unit {
63
64    use super::*;
65
66    #[tokio::test]
67    async fn encode() {
68        for (reason_code, byte) in vec![
69            (ReasonCode::Success, 0x00_u8),
70            (ReasonCode::GrantedQoS1, 0x01_u8),
71            (ReasonCode::GrantedQoS2, 0x02_u8),
72            (ReasonCode::DisconnectWithWillMessage, 0x04_u8),
73            (ReasonCode::NoMatchingSubscribers, 0x10_u8),
74            (ReasonCode::NoSubscriptionExisted, 0x11_u8),
75            (ReasonCode::ContinueAuthentication, 0x18_u8),
76            (ReasonCode::ReAuthenticate, 0x19_u8),
77            (ReasonCode::UnspecifiedError, 0x80_u8),
78            (ReasonCode::MalformedPacket, 0x81_u8),
79            (ReasonCode::ProtocolError, 0x82_u8),
80            (ReasonCode::ImplementationSpecificError, 0x83_u8),
81            (ReasonCode::UnsupportedProtocolVersion, 0x84_u8),
82            (ReasonCode::ClientIdentifierNotValid, 0x85_u8),
83            (ReasonCode::BadUserNameOrPassword, 0x86_u8),
84            (ReasonCode::NotAuthorized, 0x87_u8),
85            (ReasonCode::ServerUnavailable, 0x88_u8),
86            (ReasonCode::ServerBusy, 0x89_u8),
87            (ReasonCode::Banned, 0x8A_u8),
88            (ReasonCode::ServerShuttingDown, 0x8B_u8),
89            (ReasonCode::BadAuthenticationMethod, 0x8C_u8),
90            (ReasonCode::KeepAliveTimeout, 0x8D_u8),
91            (ReasonCode::SessionTakenOver, 0x8E_u8),
92            (ReasonCode::TopicFilterInvalid, 0x8F_u8),
93            (ReasonCode::TopicNameInvalid, 0x90_u8),
94            (ReasonCode::PacketIdentifierInUse, 0x91_u8),
95            (ReasonCode::PacketIdentifierNotFound, 0x92_u8),
96            (ReasonCode::ReceiveMaximumExceeded, 0x93_u8),
97            (ReasonCode::TopicAliasInvalid, 0x94_u8),
98            (ReasonCode::PacketTooLarge, 0x95_u8),
99            (ReasonCode::MessageRateTooHigh, 0x96_u8),
100            (ReasonCode::QuotaExceeded, 0x97_u8),
101            (ReasonCode::AdministrativeAction, 0x98_u8),
102            (ReasonCode::PayloadFormatInvalid, 0x99_u8),
103            (ReasonCode::RetainNotSupported, 0x9A_u8),
104            (ReasonCode::QoSNotSupported, 0x9B_u8),
105            (ReasonCode::UseAnotherServer, 0x9C_u8),
106            (ReasonCode::ServerMoved, 0x9D_u8),
107            (ReasonCode::SharedSubscriptionsNotSupported, 0x9E_u8),
108            (ReasonCode::ConnectionRateExceeded, 0x9F_u8),
109            (ReasonCode::MaximumConnectTime, 0xA0_u8),
110            (ReasonCode::SubscriptionIdentifiersNotSupported, 0xA1_u8),
111            (ReasonCode::WildcardSubscriptionsNotSupported, 0xA2_u8),
112        ] {
113            let mut result = Vec::new();
114            assert_eq!(
115                write_reason_code(reason_code, &mut result).await.unwrap(),
116                1
117            );
118            assert_eq!(result[0], byte);
119        }
120    }
121}