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// }