//! Error types use abscissa_core::error::{BoxError, Context}; use std::{ fmt::{self, Display}, io, ops::Deref, }; use thiserror::Error; /// Kinds of errors #[derive(Copy, Clone, Debug, Eq, Error, PartialEq)] pub enum ErrorKind { /// Error in configuration file #[error("config error")] Config, /// Input/output error #[error("I/O error")] Io, } impl ErrorKind { /// Create an error context from this error pub fn context(self, source: impl Into) -> Context { Context::new(self, Some(source.into())) } } /// Error type #[derive(Debug)] pub struct Error(Box>); impl Deref for Error { type Target = Context; fn deref(&self) -> &Context { &self.0 } } impl Display for Error { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { self.0.fmt(f) } } impl From> for Error { fn from(context: Context) -> Self { Error(Box::new(context)) } } impl From for Error { fn from(other: io::Error) -> Self { ErrorKind::Io.context(other).into() } } impl std::error::Error for Error { fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { self.0.source() } }