use std::fmt::{Display, Formatter};
use std::result::Result as StdResult;
pub use http::StatusCode;
pub type Result<R = ()> = StdResult<R, Status>;
#[macro_export]
macro_rules! status {
($status_code:expr) => {
$crate::status!($status_code, "")
};
($status_code:expr, $message:expr) => {
$crate::status!($status_code, $message, true)
};
($status_code:expr, $message:expr, $expose:expr) => {
$crate::Status::new($status_code, $message, $expose)
};
}
#[macro_export]
macro_rules! throw {
($status_code:expr) => {
return core::result::Result::Err($crate::status!($status_code))
};
($status_code:expr, $message:expr) => {
return core::result::Result::Err($crate::status!($status_code, $message))
};
($status_code:expr, $message:expr, $expose:expr) => {
return core::result::Result::Err($crate::status!($status_code, $message, $expose))
};
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct Status {
pub status_code: StatusCode,
pub message: String,
pub expose: bool,
}
impl Status {
#[inline]
pub fn new(status_code: StatusCode, message: impl ToString, expose: bool) -> Self {
Self {
status_code,
message: message.to_string(),
expose,
}
}
}
impl<E> From<E> for Status
where
E: std::error::Error,
{
#[inline]
fn from(err: E) -> Self {
Self::new(StatusCode::INTERNAL_SERVER_ERROR, err, false)
}
}
impl Display for Status {
#[inline]
fn fmt(&self, f: &mut Formatter<'_>) -> StdResult<(), std::fmt::Error> {
f.write_str(&format!("{}: {}", self.status_code, self.message))
}
}