1 // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2 // Copyright by contributors to this project.
3 // SPDX-License-Identifier: (Apache-2.0 OR MIT)
4 
5 use core::fmt::{self, Display};
6 
7 #[cfg(feature = "std")]
8 #[derive(Debug)]
9 /// Generic error used to wrap errors produced by providers.
10 pub struct AnyError(Box<dyn std::error::Error + Send + Sync>);
11 
12 #[cfg(not(feature = "std"))]
13 #[derive(Debug)]
14 pub struct AnyError;
15 
16 #[cfg(feature = "std")]
17 impl Display for AnyError {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result18     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
19         self.0.fmt(f)
20     }
21 }
22 
23 #[cfg(feature = "std")]
24 impl std::error::Error for AnyError {
source(&self) -> Option<&(dyn std::error::Error + 'static)>25     fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
26         self.0.source()
27     }
28 }
29 
30 #[cfg(not(feature = "std"))]
31 impl Display for AnyError {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result32     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
33         core::fmt::Debug::fmt(self, f)
34     }
35 }
36 
37 /// Trait to convert a provider specific error into [`AnyError`]
38 pub trait IntoAnyError: core::fmt::Debug + Sized {
39     #[cfg(feature = "std")]
into_any_error(self) -> AnyError40     fn into_any_error(self) -> AnyError {
41         self.into_dyn_error()
42             .map_or_else(|this| AnyError(format!("{this:?}").into()), AnyError)
43     }
44 
45     #[cfg(not(feature = "std"))]
into_any_error(self) -> AnyError46     fn into_any_error(self) -> AnyError {
47         AnyError
48     }
49 
50     #[cfg(feature = "std")]
into_dyn_error(self) -> Result<Box<dyn std::error::Error + Send + Sync>, Self>51     fn into_dyn_error(self) -> Result<Box<dyn std::error::Error + Send + Sync>, Self> {
52         Err(self)
53     }
54 }
55 
56 impl IntoAnyError for mls_rs_codec::Error {
57     #[cfg(feature = "std")]
into_dyn_error(self) -> Result<Box<dyn std::error::Error + Send + Sync>, Self>58     fn into_dyn_error(self) -> Result<Box<dyn std::error::Error + Send + Sync>, Self> {
59         Ok(self.into())
60     }
61 }
62 
63 impl IntoAnyError for core::convert::Infallible {}
64