#![crate_name = "httpstatus"]
use serde::{Deserialize, Serialize};
use std::convert::From;
use std::fmt::{Display, Error, Formatter};
#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Clone, Hash, Serialize, Deserialize)]
pub enum StatusCode {
Continue,
SwitchingProtocols,
Processing,
EarlyHints,
Ok,
Created,
Accepted,
NonAuthoritativeInformation,
NoContent,
ResetContent,
PartialContent,
MultiStatus,
AlreadyReported,
IMUsed,
MultipleChoices,
MovedPermanently,
Found,
SeeOther,
NotModified,
UseProxy,
SwitchProxy,
TemporaryRedirect,
PermanentRedirect,
BadRequest,
Unauthorized,
PaymentRequired,
Forbidden,
NotFound,
MethodNotAllowed,
NotAcceptable,
ProxyAuthenticationRequired,
RequestTimeout,
Conflict,
Gone,
LengthRequired,
PreconditionFailed,
PayloadTooLarge,
UriTooLong,
UnsupportedMediaType,
RangeNotSatisfiable,
ExpectationFailed,
ImATeapot,
MisdirectedRequest,
UnprocessableEntity,
Locked,
FailedDependency,
UpgradeRequired,
PreconditionRequired,
TooManyRequests,
RequestHeaderFieldsTooLarge,
UnavailableForLegalReasons,
InternalServerError,
NotImplemented,
BadGateway,
ServiceUnavailable,
GatewayTimeout,
HttpVersionNotSupported,
VariantAlsoNegotiates,
InsufficientStorage,
LoopDetected,
NotExtended,
NetworkAuthenticationRequired,
Unknown(u16),
}
#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Clone, Hash, Serialize, Deserialize)]
pub enum StatusClass {
Informational,
Success,
Redirection,
ClientError,
ServerError,
Unknown,
}
impl StatusCode {
#[inline]
pub fn as_u16(&self) -> u16 {
match *self {
StatusCode::Continue => 100,
StatusCode::SwitchingProtocols => 101,
StatusCode::Processing => 102,
StatusCode::EarlyHints => 103,
StatusCode::Ok => 200,
StatusCode::Created => 201,
StatusCode::Accepted => 202,
StatusCode::NonAuthoritativeInformation => 203,
StatusCode::NoContent => 204,
StatusCode::ResetContent => 205,
StatusCode::PartialContent => 206,
StatusCode::MultiStatus => 207,
StatusCode::AlreadyReported => 208,
StatusCode::IMUsed => 226,
StatusCode::MultipleChoices => 300,
StatusCode::MovedPermanently => 301,
StatusCode::Found => 302,
StatusCode::SeeOther => 303,
StatusCode::NotModified => 304,
StatusCode::UseProxy => 305,
StatusCode::SwitchProxy => 306,
StatusCode::TemporaryRedirect => 307,
StatusCode::PermanentRedirect => 308,
StatusCode::BadRequest => 400,
StatusCode::Unauthorized => 401,
StatusCode::PaymentRequired => 402,
StatusCode::Forbidden => 403,
StatusCode::NotFound => 404,
StatusCode::MethodNotAllowed => 405,
StatusCode::NotAcceptable => 406,
StatusCode::ProxyAuthenticationRequired => 407,
StatusCode::RequestTimeout => 408,
StatusCode::Conflict => 409,
StatusCode::Gone => 410,
StatusCode::LengthRequired => 411,
StatusCode::PreconditionFailed => 412,
StatusCode::PayloadTooLarge => 413,
StatusCode::UriTooLong => 414,
StatusCode::UnsupportedMediaType => 415,
StatusCode::RangeNotSatisfiable => 416,
StatusCode::ExpectationFailed => 417,
StatusCode::ImATeapot => 418,
StatusCode::MisdirectedRequest => 421,
StatusCode::UnprocessableEntity => 422,
StatusCode::Locked => 423,
StatusCode::FailedDependency => 424,
StatusCode::UpgradeRequired => 426,
StatusCode::PreconditionRequired => 428,
StatusCode::TooManyRequests => 429,
StatusCode::RequestHeaderFieldsTooLarge => 431,
StatusCode::UnavailableForLegalReasons => 451,
StatusCode::InternalServerError => 500,
StatusCode::NotImplemented => 501,
StatusCode::BadGateway => 502,
StatusCode::ServiceUnavailable => 503,
StatusCode::GatewayTimeout => 504,
StatusCode::HttpVersionNotSupported => 505,
StatusCode::VariantAlsoNegotiates => 506,
StatusCode::InsufficientStorage => 507,
StatusCode::LoopDetected => 508,
StatusCode::NotExtended => 510,
StatusCode::NetworkAuthenticationRequired => 511,
StatusCode::Unknown(code) => code,
}
}
#[inline]
pub fn reason_phrase(&self) -> &'static str {
match *self {
StatusCode::Continue => "Continue",
StatusCode::SwitchingProtocols => "Switching Protocols",
StatusCode::Processing => "Processing",
StatusCode::EarlyHints => "Early Hints",
StatusCode::Ok => "OK",
StatusCode::Created => "Created",
StatusCode::Accepted => "Accepted",
StatusCode::NonAuthoritativeInformation => "Non-Authoritative Information",
StatusCode::NoContent => "No Content",
StatusCode::ResetContent => "Reset Content",
StatusCode::PartialContent => "Partial Content",
StatusCode::MultiStatus => "Multi-Status",
StatusCode::AlreadyReported => "Already Reported",
StatusCode::IMUsed => "IM Used",
StatusCode::MultipleChoices => "Multiple Choices",
StatusCode::MovedPermanently => "Moved Permanently",
StatusCode::Found => "Found",
StatusCode::SeeOther => "See Other",
StatusCode::NotModified => "Not Modified",
StatusCode::UseProxy => "Use Proxy",
StatusCode::SwitchProxy => "Switch Proxy",
StatusCode::TemporaryRedirect => "Temporary Redirect",
StatusCode::PermanentRedirect => "Permanent Redirect",
StatusCode::BadRequest => "Bad Request",
StatusCode::Unauthorized => "Unauthorized",
StatusCode::PaymentRequired => "Payment Required",
StatusCode::Forbidden => "Forbidden",
StatusCode::NotFound => "Not Found",
StatusCode::MethodNotAllowed => "Method Not Allowed",
StatusCode::NotAcceptable => "Not Acceptable",
StatusCode::ProxyAuthenticationRequired => "Proxy Authentication Required",
StatusCode::RequestTimeout => "Request Timeout",
StatusCode::Conflict => "Conflict",
StatusCode::Gone => "Gone",
StatusCode::LengthRequired => "Length Required",
StatusCode::PreconditionFailed => "Precondition Failed",
StatusCode::PayloadTooLarge => "Payload Too Large",
StatusCode::UriTooLong => "URI Too Long",
StatusCode::UnsupportedMediaType => "Unsupported Media Type",
StatusCode::RangeNotSatisfiable => "Range Not Satisfiable",
StatusCode::ExpectationFailed => "Expectation Failed",
StatusCode::ImATeapot => "I'm a teapot",
StatusCode::MisdirectedRequest => "Misdirected Request",
StatusCode::UnprocessableEntity => "Unprocessable Entity",
StatusCode::Locked => "Locked",
StatusCode::FailedDependency => "Failed Dependency",
StatusCode::UpgradeRequired => "Upgrade Required",
StatusCode::PreconditionRequired => "Precondition Required",
StatusCode::TooManyRequests => "Too Many Requests",
StatusCode::RequestHeaderFieldsTooLarge => "Request Header Fields Too Large",
StatusCode::UnavailableForLegalReasons => "Unavailable For Legal Reasons",
StatusCode::InternalServerError => "Internal Server Error",
StatusCode::NotImplemented => "Not Implemented",
StatusCode::BadGateway => "Bad Gateway",
StatusCode::ServiceUnavailable => "Service Unavailable",
StatusCode::GatewayTimeout => "Gateway Timeout",
StatusCode::HttpVersionNotSupported => "Http Version Not Supported",
StatusCode::VariantAlsoNegotiates => "Variant Also Negotiates",
StatusCode::InsufficientStorage => "Insufficient Storage",
StatusCode::LoopDetected => "Loop Detected",
StatusCode::NotExtended => "Not Extended",
StatusCode::NetworkAuthenticationRequired => "Network Authentication Required",
StatusCode::Unknown(_) => "",
}
}
#[inline]
pub fn class(&self) -> StatusClass {
match self.as_u16() {
100..=199 => StatusClass::Informational,
200..=299 => StatusClass::Success,
300..=399 => StatusClass::Redirection,
400..=499 => StatusClass::ClientError,
500..=599 => StatusClass::ServerError,
_ => StatusClass::Unknown,
}
}
}
impl From<u16> for StatusCode {
fn from(code: u16) -> Self {
match code {
100 => StatusCode::Continue,
101 => StatusCode::SwitchingProtocols,
102 => StatusCode::Processing,
103 => StatusCode::EarlyHints,
200 => StatusCode::Ok,
201 => StatusCode::Created,
202 => StatusCode::Accepted,
203 => StatusCode::NonAuthoritativeInformation,
204 => StatusCode::NoContent,
205 => StatusCode::ResetContent,
206 => StatusCode::PartialContent,
207 => StatusCode::MultiStatus,
208 => StatusCode::AlreadyReported,
226 => StatusCode::IMUsed,
300 => StatusCode::MultipleChoices,
301 => StatusCode::MovedPermanently,
302 => StatusCode::Found,
303 => StatusCode::SeeOther,
304 => StatusCode::NotModified,
305 => StatusCode::UseProxy,
306 => StatusCode::SwitchProxy,
307 => StatusCode::TemporaryRedirect,
308 => StatusCode::PermanentRedirect,
400 => StatusCode::BadRequest,
401 => StatusCode::Unauthorized,
402 => StatusCode::PaymentRequired,
403 => StatusCode::Forbidden,
404 => StatusCode::NotFound,
405 => StatusCode::MethodNotAllowed,
406 => StatusCode::NotAcceptable,
407 => StatusCode::ProxyAuthenticationRequired,
408 => StatusCode::RequestTimeout,
409 => StatusCode::Conflict,
410 => StatusCode::Gone,
411 => StatusCode::LengthRequired,
412 => StatusCode::PreconditionFailed,
413 => StatusCode::PayloadTooLarge,
414 => StatusCode::UriTooLong,
415 => StatusCode::UnsupportedMediaType,
416 => StatusCode::RangeNotSatisfiable,
417 => StatusCode::ExpectationFailed,
418 => StatusCode::ImATeapot,
421 => StatusCode::MisdirectedRequest,
422 => StatusCode::UnprocessableEntity,
423 => StatusCode::Locked,
424 => StatusCode::FailedDependency,
426 => StatusCode::UpgradeRequired,
428 => StatusCode::PreconditionRequired,
429 => StatusCode::TooManyRequests,
431 => StatusCode::RequestHeaderFieldsTooLarge,
451 => StatusCode::UnavailableForLegalReasons,
500 => StatusCode::InternalServerError,
501 => StatusCode::NotImplemented,
502 => StatusCode::BadGateway,
503 => StatusCode::ServiceUnavailable,
504 => StatusCode::GatewayTimeout,
505 => StatusCode::HttpVersionNotSupported,
506 => StatusCode::VariantAlsoNegotiates,
507 => StatusCode::InsufficientStorage,
508 => StatusCode::LoopDetected,
510 => StatusCode::NotExtended,
511 => StatusCode::NetworkAuthenticationRequired,
_ => StatusCode::Unknown(code),
}
}
}
impl Display for StatusCode {
fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
write!(
f,
"{}{}{}",
self.as_u16(),
if let StatusCode::Unknown(_) = *self {
""
} else {
" "
},
self.reason_phrase()
)
}
}