1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
use std::error::Error; #[cfg(backtrace)] use crate::backtrace::Backtrace; pub trait ErrorProxy { fn source(&self) -> Option<&(dyn Error + 'static)>; #[cfg(backtrace)] fn backtrace(&self) -> Option<&Backtrace>; } impl ErrorProxy for dyn std::error::Error + 'static { fn source(&self) -> Option<&(dyn Error + 'static)> { Some(self) } #[cfg(backtrace)] fn backtrace(&self) -> Option<&Backtrace> { std::error::Error::backtrace(self) } } // // [Implementation in anyhow crate] // impl ErrorProxy for anyhow::Error { // fn source(&self) -> Option<&(dyn Error + 'static)> { // <self as anyhow::Error>.source() // } // #[cfg(backtrace)] // fn backtrace(&self) -> Option<&Backtrace> { // <self as anyhow::Error>::backtrace(self) // } // } // // [Implementation in chained-error crate] // impl ErrorProxy for error_chain::ChainedError { // fn source(&self) -> Option<&(dyn Error + 'static)> { // <self as error_chain::ChainedError>.source() // } // #[cfg(backtrace)] // fn backtrace(&self) -> Option<&Backtrace> { // <self as error_chain::ChainedError>::backtrace(self) // } // }