derive_more/
as_dyn_error.rs

1//! Coercion into `dyn `[`Error`] used in macro expansions.
2//!
3//! # Credits
4//!
5//! The initial idea and implementation was taken from the [`thiserror`] crate and its
6//! [`AsDynError`] trait implementation, and slightly modified for usage in derive [`derive_more`].
7//!
8//! The original code was dual licensed under [Apache License, Version 2.0][APACHE] and [MIT]
9//! licenses.
10//!
11//! [`AsDynError`]: https://github.com/dtolnay/thiserror/blob/2.0.3/src/aserror.rs
12//! [`derive_more`]: crate
13//! [`thiserror`]: https://github.com/dtolnay/thiserror/blob/2.0.3
14//! [APACHE]: https://github.com/dtolnay/thiserror/blob/2.0.3/LICENSE-APACHE
15//! [MIT]: https://github.com/dtolnay/thiserror/blob/2.0.3/LICENSE-MIT
16
17use core::{error::Error, panic::UnwindSafe};
18
19#[doc(hidden)]
20pub trait AsDynError<'a>: Sealed {
21    fn __derive_more_as_dyn_error(&self) -> &(dyn Error + 'a);
22}
23
24impl<'a, T: Error + 'a> AsDynError<'a> for T {
25    #[inline]
26    fn __derive_more_as_dyn_error(&self) -> &(dyn Error + 'a) {
27        self
28    }
29}
30
31impl<'a> AsDynError<'a> for dyn Error + 'a {
32    #[inline]
33    fn __derive_more_as_dyn_error(&self) -> &(dyn Error + 'a) {
34        self
35    }
36}
37
38impl<'a> AsDynError<'a> for dyn Error + Send + 'a {
39    #[inline]
40    fn __derive_more_as_dyn_error(&self) -> &(dyn Error + 'a) {
41        self
42    }
43}
44
45impl<'a> AsDynError<'a> for dyn Error + Send + Sync + 'a {
46    #[inline]
47    fn __derive_more_as_dyn_error(&self) -> &(dyn Error + 'a) {
48        self
49    }
50}
51
52impl<'a> AsDynError<'a> for dyn Error + Send + Sync + UnwindSafe + 'a {
53    #[inline]
54    fn __derive_more_as_dyn_error(&self) -> &(dyn Error + 'a) {
55        self
56    }
57}
58
59#[doc(hidden)]
60pub trait Sealed {}
61impl<T: Error> Sealed for T {}
62impl Sealed for dyn Error + '_ {}
63impl Sealed for dyn Error + Send + '_ {}
64impl Sealed for dyn Error + Send + Sync + '_ {}
65impl Sealed for dyn Error + Send + Sync + UnwindSafe + '_ {}