use std::fmt::{self, Debug, Display};
pub trait Any: std::error::Error {
fn as_any(&self) -> &dyn std::any::Any;
}
#[derive(Debug)]
pub enum Error {
Unknown,
Code(i32),
Message(String),
Any(Box<dyn Any + Send>),
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Unknown => write!(f, "Error unknown"),
Self::Code(code) => write!(f, "{}", code),
Self::Message(message) => write!(f, "{}", message),
Self::Any(err) => write!(f, "{}", err),
}
}
}
impl std::error::Error for Error {}
impl Error {
pub fn with_message(message: impl Display) -> Self {
Self::Message(message.to_string())
}
pub fn with_err(err: impl Any + Send + 'static) -> Self {
Self::Any(Box::new(err))
}
}