use std::fmt;
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum StatusKind {
Success,
Error,
ClientError,
ServerError,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Status {
kind: StatusKind,
code: i64,
}
impl Status {
fn new(kind: StatusKind, code: i64) -> Self {
Self { kind, code }
}
pub fn success(code: i64) -> Self {
Self::new(StatusKind::Success, code)
}
pub fn client_error(code: i64) -> Self {
Self::new(StatusKind::ClientError, code)
}
pub fn server_error(code: i64) -> Self {
Self::new(StatusKind::ServerError, code)
}
pub fn error(code: i64) -> Self {
Self::new(StatusKind::Error, code)
}
pub fn kind(&self) -> StatusKind {
self.kind
}
pub fn code(&self) -> i64 {
self.code
}
}
impl fmt::Display for StatusKind {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Success => write!(f, "Success"),
Self::Error => write!(f, "Error"),
Self::ClientError => write!(f, "Client Error"),
Self::ServerError => write!(f, "Server Error"),
}
}
}
impl fmt::Display for Status {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}({})", self.kind, self.code)
}
}
#[cfg(feature = "http")]
impl From<http::StatusCode> for Status {
fn from(status: http::StatusCode) -> Self {
let kind = match status {
s if s.is_success() => StatusKind::Success,
s if s.is_client_error() => StatusKind::ClientError,
s if s.is_server_error() => StatusKind::ServerError,
_ => StatusKind::Error,
};
Status::new(kind, status.as_u16().into())
}
}