core_crypto/error/
recursive.rs1#[derive(Debug)]
22pub enum RecursiveError {
23 Root {
25 context: &'static str,
27 source: Box<crate::Error>,
29 },
30 E2e {
32 context: &'static str,
34 source: Box<crate::e2e_identity::Error>,
36 },
37 Mls {
39 context: &'static str,
41 source: Box<crate::mls::Error>,
43 },
44 MlsClient {
46 context: &'static str,
48 source: Box<crate::mls::client::Error>,
50 },
51 MlsConversation {
53 context: &'static str,
55 source: Box<crate::mls::conversation::Error>,
57 },
58 MlsCredential {
60 context: &'static str,
62 source: Box<crate::mls::credential::Error>,
64 },
65 #[cfg(test)]
67 Test(Box<crate::test_utils::TestError>),
68}
69
70impl RecursiveError {
71 pub fn root<E: Into<crate::Error>>(context: &'static str) -> impl FnOnce(E) -> Self {
73 move |into_source| Self::Root {
74 context,
75 source: Box::new(into_source.into()),
76 }
77 }
78
79 pub fn e2e_identity<E: Into<crate::e2e_identity::Error>>(context: &'static str) -> impl FnOnce(E) -> Self {
81 move |into_source| Self::E2e {
82 context,
83 source: Box::new(into_source.into()),
84 }
85 }
86
87 pub fn mls<E: Into<crate::mls::Error>>(context: &'static str) -> impl FnOnce(E) -> Self {
89 move |into_source| Self::Mls {
90 context,
91 source: Box::new(into_source.into()),
92 }
93 }
94
95 pub fn mls_client<E: Into<crate::mls::client::Error>>(context: &'static str) -> impl FnOnce(E) -> Self {
97 move |into_source| Self::MlsClient {
98 context,
99 source: Box::new(into_source.into()),
100 }
101 }
102
103 pub fn mls_conversation<E: Into<crate::mls::conversation::Error>>(context: &'static str) -> impl FnOnce(E) -> Self {
105 move |into_source| Self::MlsConversation {
106 context,
107 source: Box::new(into_source.into()),
108 }
109 }
110
111 pub fn mls_credential<E: Into<crate::mls::credential::Error>>(context: &'static str) -> impl FnOnce(E) -> Self {
113 move |into_source| Self::MlsCredential {
114 context,
115 source: Box::new(into_source.into()),
116 }
117 }
118
119 #[cfg(test)]
120 pub(crate) fn test<E: Into<crate::test_utils::TestError>>() -> impl FnOnce(E) -> Self {
121 move |into_source| Self::Test(Box::new(into_source.into()))
122 }
123}
124
125impl std::fmt::Display for RecursiveError {
126 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
127 #[cfg(test)]
128 use std::ops::Deref;
129
130 let context = match self {
131 RecursiveError::Root { context, .. } => context,
132 RecursiveError::E2e { context, .. } => context,
133 RecursiveError::Mls { context, .. } => context,
134 RecursiveError::MlsClient { context, .. } => context,
135 RecursiveError::MlsConversation { context, .. } => context,
136 RecursiveError::MlsCredential { context, .. } => context,
137 #[cfg(test)]
138 RecursiveError::Test(e) => return e.deref().fmt(f),
139 };
140 write!(f, "{}", context)
141 }
142}
143
144impl std::error::Error for RecursiveError {
145 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
146 match self {
147 RecursiveError::Root { source, .. } => Some(source.as_ref()),
148 RecursiveError::E2e { source, .. } => Some(source.as_ref()),
149 RecursiveError::Mls { source, .. } => Some(source.as_ref()),
150 RecursiveError::MlsClient { source, .. } => Some(source.as_ref()),
151 RecursiveError::MlsConversation { source, .. } => Some(source.as_ref()),
152 RecursiveError::MlsCredential { source, .. } => Some(source.as_ref()),
153 #[cfg(test)]
154 RecursiveError::Test(source) => Some(source.as_ref()),
155 }
156 }
157}
158
159pub trait ToRecursiveError {
163 fn construct_recursive(self, context: &'static str) -> RecursiveError;
165}
166
167macro_rules! impl_to_recursive_error_for {
168 ($($for:path => $variant:ident),+ $(,)?) => {
169 $(
170 impl ToRecursiveError for $for {
171 fn construct_recursive(self, context: &'static str) -> RecursiveError {
172 RecursiveError::$variant {
173 context,
174 source: Box::new(self),
175 }
176 }
177 }
178 )+
179 };
180}
181
182impl_to_recursive_error_for!(
183 crate::Error => Root,
184 crate::e2e_identity::Error => E2e,
185 crate::mls::Error => Mls,
186 crate::mls::client::Error => MlsClient,
187 crate::mls::conversation::Error => MlsConversation,
188 crate::mls::credential::Error => MlsCredential,
189);