1use crate::{codec, ReasonCode, Result as SageResult};
2use std::marker::Unpin;
3use tokio::io::AsyncWrite;
4
5pub 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}