    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48

    use std::error::Error;
    use std::panic::UnwindSafe;

    pub trait AsDynError<'a>: Sealed {
        fn as_dyn_error(&self) -> &(dyn Error + 'a);
    }

    impl<'a, T: Error + 'a> AsDynError<'a> for T {
        #[inline]
        fn as_dyn_error(&self) -> &(dyn Error + 'a) {
            self
        }
    }

    impl<'a> AsDynError<'a> for dyn Error + 'a {
        #[inline]
        fn as_dyn_error(&self) -> &(dyn Error + 'a) {
            self
        }
    }

    impl<'a> AsDynError<'a> for dyn Error + Send + 'a {
        #[inline]
        fn as_dyn_error(&self) -> &(dyn Error + 'a) {
            self
        }
    }

    impl<'a> AsDynError<'a> for dyn Error + Send + Sync + 'a {
        #[inline]
        fn as_dyn_error(&self) -> &(dyn Error + 'a) {
            self
        }
    }

    impl<'a> AsDynError<'a> for dyn Error + Send + Sync + UnwindSafe + 'a {
        #[inline]
        fn as_dyn_error(&self) -> &(dyn Error + 'a) {
            self
        }
    }

    pub trait Sealed {}
    impl<'a, T: Error + 'a> Sealed for T {}
    impl<'a> Sealed for dyn Error + 'a {}
    impl<'a> Sealed for dyn Error + Send + 'a {}
    impl<'a> Sealed for dyn Error + Send + Sync + 'a {}
    impl<'a> Sealed for dyn Error + Send + Sync + UnwindSafe + 'a {}