mqtt/control/variable_header/
connect_ret_code.rs1use std::io::{self, Read, Write};
2
3use byteorder::{ReadBytesExt, WriteBytesExt};
4
5use crate::control::variable_header::VariableHeaderError;
6use crate::{Decodable, Encodable};
7
8pub const CONNECTION_ACCEPTED: u8 = 0x00;
9pub const UNACCEPTABLE_PROTOCOL_VERSION: u8 = 0x01;
10pub const IDENTIFIER_REJECTED: u8 = 0x02;
11pub const SERVICE_UNAVAILABLE: u8 = 0x03;
12pub const BAD_USER_NAME_OR_PASSWORD: u8 = 0x04;
13pub const NOT_AUTHORIZED: u8 = 0x05;
14
15#[derive(Debug, Eq, PartialEq, Copy, Clone)]
17pub enum ConnectReturnCode {
18 ConnectionAccepted,
19 UnacceptableProtocolVersion,
20 IdentifierRejected,
21 ServiceUnavailable,
22 BadUserNameOrPassword,
23 NotAuthorized,
24 Reserved(u8),
25}
26
27impl ConnectReturnCode {
28 pub fn to_u8(self) -> u8 {
30 match self {
31 ConnectReturnCode::ConnectionAccepted => CONNECTION_ACCEPTED,
32 ConnectReturnCode::UnacceptableProtocolVersion => UNACCEPTABLE_PROTOCOL_VERSION,
33 ConnectReturnCode::IdentifierRejected => IDENTIFIER_REJECTED,
34 ConnectReturnCode::ServiceUnavailable => SERVICE_UNAVAILABLE,
35 ConnectReturnCode::BadUserNameOrPassword => BAD_USER_NAME_OR_PASSWORD,
36 ConnectReturnCode::NotAuthorized => NOT_AUTHORIZED,
37 ConnectReturnCode::Reserved(r) => r,
38 }
39 }
40
41 pub fn from_u8(code: u8) -> ConnectReturnCode {
43 match code {
44 CONNECTION_ACCEPTED => ConnectReturnCode::ConnectionAccepted,
45 UNACCEPTABLE_PROTOCOL_VERSION => ConnectReturnCode::UnacceptableProtocolVersion,
46 IDENTIFIER_REJECTED => ConnectReturnCode::IdentifierRejected,
47 SERVICE_UNAVAILABLE => ConnectReturnCode::ServiceUnavailable,
48 BAD_USER_NAME_OR_PASSWORD => ConnectReturnCode::BadUserNameOrPassword,
49 NOT_AUTHORIZED => ConnectReturnCode::NotAuthorized,
50 _ => ConnectReturnCode::Reserved(code),
51 }
52 }
53}
54
55impl Encodable for ConnectReturnCode {
56 fn encode<W: Write>(&self, writer: &mut W) -> Result<(), io::Error> {
57 writer.write_u8(self.to_u8())
58 }
59
60 fn encoded_length(&self) -> u32 {
61 1
62 }
63}
64
65impl Decodable for ConnectReturnCode {
66 type Error = VariableHeaderError;
67 type Cond = ();
68
69 fn decode_with<R: Read>(reader: &mut R, _rest: ()) -> Result<ConnectReturnCode, VariableHeaderError> {
70 reader.read_u8().map(ConnectReturnCode::from_u8).map_err(From::from)
71 }
72}