Skip to content

Commit

Permalink
Merge pull request #134 from dtolnay/nonstatic
Browse files Browse the repository at this point in the history
Support non-static lifetime inside error(transparent)
  • Loading branch information
dtolnay committed May 22, 2021
2 parents ee2a47d + 1ed8751 commit e49c10f
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 10 deletions.
20 changes: 10 additions & 10 deletions 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<T: Error + 'static> 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
}
}
21 changes: 21 additions & 0 deletions tests/test_transparent.rs
Expand Up @@ -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());
}

0 comments on commit e49c10f

Please sign in to comment.