use std::any;
use std::error;
use std::fmt;
use std::io;
#[derive(Debug)]
pub enum Error {
Io(io::Error),
Create(Box<dyn error::Error + Send + Sync + 'static>),
ShutdownPanicked(String),
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Self::Io(err) => write!(f, "IO error: {err}"),
Self::Create(err) => write!(f, "error creating metrics server: {err}"),
Self::ShutdownPanicked(err) => write!(f, "server thread panicked: {err}"),
}
}
}
impl error::Error for Error {
fn source(&self) -> Option<&(dyn error::Error + 'static)> {
match self {
Self::Io(err) => Some(err),
_ => None,
}
}
}
impl From<io::Error> for Error {
fn from(err: io::Error) -> Self {
Self::Io(err)
}
}
impl From<Box<dyn error::Error + Send + Sync + 'static>> for Error {
fn from(err: Box<dyn error::Error + Send + Sync + 'static>) -> Self {
Self::Create(err)
}
}
impl From<Box<dyn any::Any + Send + 'static>> for Error {
fn from(payload: Box<dyn any::Any + Send + 'static>) -> Self {
let err = if let Some(s) = payload.downcast_ref::<String>() {
s.clone()
} else if let Some(s) = payload.downcast_ref::<&str>() {
s.to_string()
} else {
format!("{:?}", payload)
};
Self::ShutdownPanicked(err)
}
}