#![forbid(unsafe_code)]
#[cfg(feature = "http")]
mod http;
mod result;
pub use result::ResultExt;
use std::error::Error as StdError;
use std::fmt::{Debug, Display};
pub struct ErrorStatus {
inner: Box<Inner>,
}
struct Inner {
kind: ErrorKind,
context: String,
source: Box<dyn StdError + Sync + Send + 'static>,
}
impl ErrorStatus {
pub fn kind(&self) -> ErrorKind {
self.inner.kind
}
pub fn context(&self) -> &str {
&self.inner.context
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum ErrorKind {
BadRequest,
Unauthorized,
Forbidden,
NotFound,
MethodNotAllowed,
RequestTimeout,
Gone,
PreconditionFailed,
PayloadTooLarge,
Unsupported,
UnprocessableEntity,
TooManyRequests,
InternalError,
NotImplemented,
Unavailable,
}
impl StdError for ErrorStatus {
fn source(&self) -> Option<&(dyn StdError + 'static)> {
Some(self.inner.source.as_ref())
}
}
impl Display for ErrorStatus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?} - {}", self.inner.kind, self.inner.context)
}
}
impl Debug for ErrorStatus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Error")
.field("kind", &self.inner.kind)
.field("source", &self.inner.source)
.finish()
}
}