diff --git a/src/aserror.rs b/src/aserror.rs index 8290296..f440034 100644 --- a/src/aserror.rs +++ b/src/aserror.rs @@ -1,33 +1,33 @@ use std::error::Error; -pub trait AsDynError { - fn as_dyn_error(&self) -> &(dyn Error + 'static); +pub trait AsDynError<'a> { + fn as_dyn_error(&self) -> &(dyn Error + 'a); } -impl AsDynError for T { +impl<'a, T: Error + 'a> AsDynError<'a> for T { #[inline] - fn as_dyn_error(&self) -> &(dyn Error + 'static) { + fn as_dyn_error(&self) -> &(dyn Error + 'a) { self } } -impl AsDynError for dyn Error + 'static { +impl<'a> AsDynError<'a> for dyn Error + 'a { #[inline] - fn as_dyn_error(&self) -> &(dyn Error + 'static) { + fn as_dyn_error(&self) -> &(dyn Error + 'a) { self } } -impl AsDynError for dyn Error + Send + 'static { +impl<'a> AsDynError<'a> for dyn Error + Send + 'a { #[inline] - fn as_dyn_error(&self) -> &(dyn Error + 'static) { + fn as_dyn_error(&self) -> &(dyn Error + 'a) { self } } -impl AsDynError for dyn Error + Send + Sync + 'static { +impl<'a> AsDynError<'a> for dyn Error + Send + Sync + 'a { #[inline] - fn as_dyn_error(&self) -> &(dyn Error + 'static) { + fn as_dyn_error(&self) -> &(dyn Error + 'a) { self } } diff --git a/tests/test_transparent.rs b/tests/test_transparent.rs index b862b25..84d7c91 100644 --- a/tests/test_transparent.rs +++ b/tests/test_transparent.rs @@ -57,3 +57,24 @@ fn test_anyhow() { assert_eq!("outer", error.to_string()); assert_eq!("inner", error.source().unwrap().to_string()); } + +#[test] +fn test_non_static() { + #[derive(Error, Debug)] + #[error(transparent)] + struct Error<'a> { + inner: ErrorKind<'a>, + } + + #[derive(Error, Debug)] + enum ErrorKind<'a> { + #[error("unexpected token: {:?}", token)] + Unexpected { token: &'a str }, + } + + let error = Error { + inner: ErrorKind::Unexpected { token: "error" }, + }; + assert_eq!("unexpected token: \"error\"", error.to_string()); + assert!(error.source().is_none()); +}