mqtt/control/variable_header/
connect_ret_code.rs

1use 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/// Return code for `CONNACK` packet
16#[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    /// Get the code
29    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    /// Create `ConnectReturnCode` from code
42    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}