use std::fmt;
pub const E_CANCEL: u8 = 0x8;
pub const E_COMPRESSION: u8 = 0x9;
pub const E_CONNECT: u8 = 0xA;
pub const E_ENHANCE_YOUR_CALM: u8 = 0xB;
pub const E_FLOW_CONTROL: u8 = 0x3;
pub const E_FRAME_SIZE: u8 = 0x6;
pub const E_HTTP_1_1_REQUIRED: u8 = 0xD;
pub const E_INADEQUATE_SECURITY: u8 = 0xC;
pub const E_NO_ERROR: u8 = 0x0;
pub const E_INTERNAL: u8 = 0x2;
pub const E_PROTOCOL: u8 = 0x1;
pub const E_REFUSED_STREAM: u8 = 0x7;
pub const E_SETTINGS_TIMEOUT: u8 = 0x4;
pub const E_STREAM_CLOSED: u8 = 0x5;
pub const E_UNSUPPORTED: u8 = 0xFF;
#[derive(Clone,Copy,PartialEq)]
#[repr(u8)]
pub enum ErrorCode {
Cancel = E_CANCEL,
Compression = E_COMPRESSION,
Connect = E_CONNECT,
EnhanceYourCalm = E_ENHANCE_YOUR_CALM,
FlowControl = E_FLOW_CONTROL,
FrameSize = E_FRAME_SIZE,
Http11Required = E_HTTP_1_1_REQUIRED,
InadequateSecurity = E_INADEQUATE_SECURITY,
NoError = E_NO_ERROR,
Internal = E_INTERNAL,
Protocol = E_PROTOCOL,
RefusedStream = E_REFUSED_STREAM,
SettingsTimeout = E_SETTINGS_TIMEOUT,
StreamClosed = E_STREAM_CLOSED,
Unsupported = E_UNSUPPORTED
}
impl ErrorCode {
pub fn from_u8(byte: u8) -> ErrorCode {
match byte {
E_CANCEL => ErrorCode::Cancel,
E_COMPRESSION => ErrorCode::Compression,
E_CONNECT => ErrorCode::Connect,
E_ENHANCE_YOUR_CALM => ErrorCode::EnhanceYourCalm,
E_FLOW_CONTROL => ErrorCode::FlowControl,
E_FRAME_SIZE => ErrorCode::FrameSize,
E_HTTP_1_1_REQUIRED => ErrorCode::Http11Required,
E_INADEQUATE_SECURITY => ErrorCode::InadequateSecurity,
E_INTERNAL => ErrorCode::Internal,
E_NO_ERROR => ErrorCode::NoError,
E_PROTOCOL => ErrorCode::Protocol,
E_REFUSED_STREAM => ErrorCode::RefusedStream,
E_SETTINGS_TIMEOUT => ErrorCode::SettingsTimeout,
E_STREAM_CLOSED => ErrorCode::StreamClosed,
_ => ErrorCode::Unsupported
}
}
pub fn as_byte(&self) -> u8 {
match *self {
ErrorCode::Cancel => E_CANCEL,
ErrorCode::Compression => E_COMPRESSION,
ErrorCode::Connect => E_CONNECT,
ErrorCode::EnhanceYourCalm => E_ENHANCE_YOUR_CALM,
ErrorCode::FlowControl => E_FLOW_CONTROL,
ErrorCode::FrameSize => E_FRAME_SIZE,
ErrorCode::Http11Required => E_HTTP_1_1_REQUIRED,
ErrorCode::InadequateSecurity => E_INADEQUATE_SECURITY,
ErrorCode::Internal => E_INTERNAL,
ErrorCode::NoError => E_NO_ERROR,
ErrorCode::Protocol => E_PROTOCOL,
ErrorCode::RefusedStream => E_REFUSED_STREAM,
ErrorCode::SettingsTimeout => E_SETTINGS_TIMEOUT,
ErrorCode::StreamClosed => E_STREAM_CLOSED,
ErrorCode::Unsupported => E_UNSUPPORTED
}
}
fn format(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
match *self {
ErrorCode::Cancel => {
write!(
formatter,
"<ErrorCode::Cancel>"
)
},
ErrorCode::Compression => {
write!(
formatter,
"<ErrorCode::Compression>"
)
},
ErrorCode::Connect => {
write!(
formatter,
"<ErrorCode::Connect>"
)
},
ErrorCode::EnhanceYourCalm => {
write!(
formatter,
"<ErrorCode::EnhanceYourCalm>"
)
},
ErrorCode::FlowControl => {
write!(
formatter,
"<ErrorCode::FlowControl>"
)
},
ErrorCode::FrameSize => {
write!(
formatter,
"<ErrorCode::FrameSize>"
)
},
ErrorCode::Http11Required => {
write!(
formatter,
"<ErrorCode::Http11Required>"
)
},
ErrorCode::InadequateSecurity => {
write!(
formatter,
"<ErrorCode::InadequateSecurity>"
)
},
ErrorCode::Internal => {
write!(
formatter,
"<ErrorCode::Internal>"
)
},
ErrorCode::NoError => {
write!(
formatter,
"<ErrorCode::NoError>"
)
},
ErrorCode::Protocol => {
write!(
formatter,
"<ErrorCode::Protocol>"
)
},
ErrorCode::RefusedStream => {
write!(
formatter,
"<ErrorCode::RefusedStream>"
)
},
ErrorCode::SettingsTimeout => {
write!(
formatter,
"<ErrorCode::SettingsTimeout>"
)
},
ErrorCode::StreamClosed => {
write!(
formatter,
"<ErrorCode::StreamClosed>"
)
},
ErrorCode::Unsupported => {
write!(
formatter,
"<ErrorCode::Unsupported>"
)
}
}
}
pub fn is_cancel(&self) -> bool {
*self == ErrorCode::Cancel
}
pub fn is_compression(&self) -> bool {
*self == ErrorCode::Compression
}
pub fn is_connect(&self) -> bool {
*self == ErrorCode::Connect
}
pub fn is_enhance_your_calm(&self) -> bool {
*self == ErrorCode::EnhanceYourCalm
}
pub fn is_flow_control(&self) -> bool {
*self == ErrorCode::FlowControl
}
pub fn is_frame_size(&self) -> bool {
*self == ErrorCode::FrameSize
}
pub fn is_http_1_1_required(&self) -> bool {
*self == ErrorCode::Http11Required
}
pub fn is_inadequate_security(&self) -> bool {
*self == ErrorCode::InadequateSecurity
}
pub fn is_internal(&self) -> bool {
*self == ErrorCode::Internal
}
pub fn is_no_error(&self) -> bool {
*self == ErrorCode::NoError
}
pub fn is_protocol(&self) -> bool {
*self == ErrorCode::Protocol
}
pub fn is_refused_stream(&self) -> bool {
*self == ErrorCode::RefusedStream
}
pub fn is_settings_timeout(&self) -> bool {
*self == ErrorCode::SettingsTimeout
}
pub fn is_stream_closed(&self) -> bool {
*self == ErrorCode::StreamClosed
}
}
impl fmt::Debug for ErrorCode {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
self.format(formatter)
}
}
impl fmt::Display for ErrorCode {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
self.format(formatter)
}
}