Support any source() that derefs to std::error::Error
This commit is contained in:
parent
bb13f4b07a
commit
761ff1c708
|
@ -35,10 +35,11 @@ fn struct_error(input: &DeriveInput, data: &DataStruct) -> Result<TokenStream> {
|
|||
};
|
||||
|
||||
let source_method = source.map(|source| {
|
||||
let member = quote_spanned!(source.span()=> &self.#source);
|
||||
let member = quote_spanned!(source.span()=> self.#source);
|
||||
quote! {
|
||||
fn source(&self) -> std::option::Option<&(dyn std::error::Error + 'static)> {
|
||||
std::option::Option::Some(#member)
|
||||
use thiserror::private::AsDynError;
|
||||
std::option::Option::Some(#member.as_dyn_error())
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
use std::error::Error;
|
||||
|
||||
pub trait AsDynError {
|
||||
fn as_dyn_error(&self) -> &(dyn Error + 'static);
|
||||
}
|
||||
|
||||
impl<T: Error + 'static> AsDynError for T {
|
||||
fn as_dyn_error(&self) -> &(dyn Error + 'static) {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
impl AsDynError for dyn Error + 'static {
|
||||
fn as_dyn_error(&self) -> &(dyn Error + 'static) {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
impl AsDynError for dyn Error + Send + Sync + 'static {
|
||||
fn as_dyn_error(&self) -> &(dyn Error + 'static) {
|
||||
self
|
||||
}
|
||||
}
|
|
@ -1 +1,9 @@
|
|||
mod aserror;
|
||||
|
||||
pub use thiserror_impl::*;
|
||||
|
||||
// Not public API.
|
||||
#[doc(hidden)]
|
||||
pub mod private {
|
||||
pub use crate::aserror::AsDynError;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue