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