#![doc(
html_no_source,
html_logo_url = "https://astral-engine.github.io/docs/logo_astral.svg",
html_favicon_url = "https://astral-engine.github.io/docs/logo.svg",
test(attr(
deny(
future_incompatible,
nonstandard_style,
rust_2018_compatibility,
rust_2018_idioms,
unused,
macro_use_extern_crate,
trivial_casts,
trivial_numeric_casts,
unused_import_braces,
unused_lifetimes,
unused_qualifications,
variant_size_differences,
),
allow(unused_extern_crates)
))
)]
#![warn(
future_incompatible,
nonstandard_style,
rust_2018_compatibility,
rust_2018_idioms,
unused,
macro_use_extern_crate,
missing_copy_implementations,
missing_debug_implementations,
missing_docs,
// missing_doc_code_examples,
single_use_lifetimes,
trivial_casts,
trivial_numeric_casts,
unreachable_pub,
unused_import_braces,
unused_lifetimes,
unused_qualifications,
unused_results,
variant_size_differences,
clippy::pedantic
)]
mod chained;
mod custom;
mod option_ext;
mod repr;
mod result;
mod result_ext;
pub use self::{option_ext::OptionExt, result::Result, result_ext::ResultExt};
use std::{
error,
fmt::{self, Debug, Display, Formatter},
};
use self::{chained::Chained, custom::Custom, repr::Repr};
pub struct Error<Kind> {
repr: Repr<Kind>,
}
impl<Kind> Error<Kind> {
pub fn new<E>(kind: Kind, error: E) -> Self
where
E: Into<Box<dyn error::Error + Send + Sync>>,
{
Self {
repr: Repr::Custom(Box::new(Custom {
kind,
error: error.into(),
})),
}
}
pub fn chained<E, S>(kind: Kind, error: E, source: S) -> Self
where
E: Into<Box<dyn error::Error + Send + Sync>>,
S: Into<Box<dyn error::Error + Send + Sync>>,
{
Self {
repr: Repr::Chained(Box::new(Chained {
kind,
error: error.into(),
source: source.into(),
})),
}
}
pub fn get_ref(&self) -> Option<&(dyn error::Error + Send + Sync + 'static)> {
self.repr.get_ref()
}
pub fn get_mut(&mut self) -> Option<&mut (dyn error::Error + Send + Sync + 'static)> {
self.repr.get_mut()
}
#[inline]
pub fn into_inner(self) -> Option<Box<dyn error::Error + Send + Sync>> {
self.repr.into_inner()
}
#[inline]
pub fn kind(&self) -> &Kind {
self.repr.kind()
}
}
impl<Kind> Debug for Error<Kind>
where
Kind: Debug,
{
fn fmt(&self, fmt: &mut Formatter<'_>) -> fmt::Result {
Debug::fmt(&self.repr, fmt)
}
}
impl<Kind> Display for Error<Kind>
where
Kind: Display,
{
#[inline]
fn fmt(&self, fmt: &mut Formatter<'_>) -> fmt::Result {
Display::fmt(&self.repr, fmt)
}
}
impl<Kind> error::Error for Error<Kind>
where
Kind: Debug + Display,
{
#[inline]
fn source(&self) -> Option<&(dyn error::Error + 'static)> {
self.repr.source()
}
}
impl<Kind> From<Kind> for Error<Kind> {
#[inline]
fn from(kind: Kind) -> Self {
Self {
repr: Repr::Simple(kind),
}
}
}