1mod cryptobox_migration;
18mod keystore;
19mod leaf;
20mod mls;
21mod proteus;
22mod recursive;
23mod wrapper;
24
25pub use cryptobox_migration::{CryptoboxMigrationError, CryptoboxMigrationErrorKind};
26pub use keystore::KeystoreError;
27pub use leaf::LeafError;
28pub use mls::{MlsError, MlsErrorKind};
29pub use proteus::{ProteusError, ProteusErrorKind};
30pub use recursive::{RecursiveError, ToRecursiveError};
31pub(crate) use wrapper::WrappedContextualError;
32
33pub type Result<T, E = Error> = core::result::Result<T, E>;
35
36#[derive(Debug, thiserror::Error)]
38pub enum Error {
39 #[error("This context has already been finished and can no longer be used.")]
41 InvalidContext,
42 #[error("Proteus client hasn't been initialized")]
44 ProteusNotInitialized,
45 #[error("The mls transport callbacks needed for CoreCrypto to operate were not set")]
47 MlsTransportNotProvided,
48 #[error("Error during mls transport: {0}")]
50 ErrorDuringMlsTransport(String),
51 #[error("This item requires a feature that the core-crypto library was built without: {0}")]
53 FeatureDisabled(&'static str),
54 #[error(transparent)]
56 Keystore(#[from] KeystoreError),
57 #[error(transparent)]
59 Mls(#[from] MlsError),
60 #[error(transparent)]
62 Proteus(#[from] ProteusError),
63 #[error(transparent)]
65 CryptoboxMigration(#[from] CryptoboxMigrationError),
66 #[error(transparent)]
68 Recursive(#[from] RecursiveError),
69}
70
71pub trait InnermostErrorMessage {
80 fn innermost_error_message(&self) -> String;
82}
83
84impl<E: std::error::Error> InnermostErrorMessage for E {
85 fn innermost_error_message(&self) -> String {
86 let mut err: &dyn std::error::Error = self;
87 while let Some(source) = err.source() {
88 err = source;
89 }
90 err.to_string()
91 }
92}
93
94#[cfg(test)]
95mod tests {
96 use super::*;
97
98 #[test]
99 fn can_unpack_wrapped_error() {
100 let inner = Error::InvalidContext;
101 let outer = RecursiveError::root("wrapping the inner for test purposes")(inner);
102 let message = outer.innermost_error_message();
103 assert_eq!(message, Error::InvalidContext.to_string());
104 }
105}