pub trait WithBacktrace {
fn capture(inner: &dyn std::error::Error) -> Self;
#[cfg(feature = "backtrace")]
fn provide<'a>(&'a self, request: &mut std::error::Request<'a>);
}
#[derive(Clone, Copy)]
pub struct NoExtraBacktrace;
impl WithBacktrace for NoExtraBacktrace {
fn capture(_inner: &dyn std::error::Error) -> Self {
Self
}
#[cfg(feature = "backtrace")]
fn provide<'a>(&'a self, _request: &mut std::error::Request<'a>) {}
}
#[cfg(feature = "backtrace")]
mod maybe {
use super::WithBacktrace;
use std::backtrace::Backtrace;
pub struct MaybeBacktrace(Option<Backtrace>);
impl WithBacktrace for MaybeBacktrace {
fn capture(inner: &dyn std::error::Error) -> Self {
let inner = if std::error::request_ref::<Backtrace>(inner).is_none() {
Some(Backtrace::capture())
} else {
None
};
Self(inner)
}
fn provide<'a>(&'a self, request: &mut std::error::Request<'a>) {
if let Some(backtrace) = &self.0 {
request.provide_ref(backtrace);
}
}
}
}
#[cfg(feature = "backtrace")]
pub use maybe::MaybeBacktrace;