use std::fmt::Display; #[derive(Debug)] pub struct OptDynErr(Option>); impl AsRef for OptDynErr { fn as_ref(&self) -> &(dyn snafu::Error + 'static) { self } } impl OptDynErr { pub fn some_boxed(e: E) -> Self { Self(Some(Box::new(e))) } pub fn some(e: Box) -> Self { Self(Some(e)) } pub fn none() -> Self { Self(None) } } impl Display for OptDynErr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match &self.0 { Some(e) => e.fmt(f), None => write!(f, "None"), } } } impl snafu::Error for OptDynErr { fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { None } fn cause(&self) -> Option<&dyn std::error::Error> { self.source() } } impl From>> for OptDynErr { fn from(value: Option>) -> Self { Self(value) } } impl From> for OptDynErr { fn from(value: Box) -> Self { Self::some(value) } }