1mod keystore;
2mod open_mls;
3mod proteus;
4mod recursive;
5mod tls;
6mod wrapper;
7
8pub use keystore::KeystoreError;
9pub use open_mls::{OpenMlsError, OpenMlsErrorKind};
10pub use proteus::{ProteusError, ProteusErrorKind};
11pub use recursive::{RecursiveError, ToRecursiveError};
12pub use tls::TlsCodecError;
13
14pub type Result<T, E = Error> = core::result::Result<T, E>;
16
17#[derive(Debug, thiserror::Error)]
19pub enum Error {
20 #[error("Proteus client hasn't been initialized")]
22 ProteusNotInitialized,
23 #[error("The mls transport callbacks needed for CoreCrypto to operate were not set")]
25 MlsTransportNotProvided,
26 #[error("Error during mls transport: {0}")]
28 ErrorDuringMlsTransport(String),
29 #[error("This item requires a feature that the core-crypto library was built without: {0}")]
31 FeatureDisabled(&'static str),
32 #[error(transparent)]
34 Keystore(#[from] KeystoreError),
35 #[error("Invalid history secret: {0}")]
37 InvalidHistorySecret(&'static str),
38 #[error(transparent)]
40 OpenMls(#[from] OpenMlsError),
41 #[error(transparent)]
43 E2eIdentity(#[from] wire_e2e_identity::E2eIdentityError),
44 #[error(transparent)]
46 Proteus(#[from] ProteusError),
47 #[error(transparent)]
49 Recursive(#[from] RecursiveError),
50}
51
52pub trait InnermostErrorMessage {
61 fn innermost_error_message(&self) -> String;
63}
64
65impl<E: std::error::Error> InnermostErrorMessage for E {
66 fn innermost_error_message(&self) -> String {
67 let mut err: &dyn std::error::Error = self;
68 while let Some(source) = err.source() {
69 err = source;
70 }
71 err.to_string()
72 }
73}
74
75#[cfg(test)]
76mod tests {
77 use super::*;
78
79 #[test]
80 fn can_unpack_wrapped_error() {
81 let inner = Error::MlsTransportNotProvided;
82 let outer = RecursiveError::context("wrapping the inner for test purposes")(inner);
83 let message = outer.innermost_error_message();
84 assert_eq!(message, Error::MlsTransportNotProvided.to_string());
85 }
86}