core_crypto/error/proteus.rs
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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
// Wire
// Copyright (C) 2022 Wire Swiss GmbH
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program. If not, see http://www.gnu.org/licenses/.
/// A Proteus operation failed, but we captured some context about how it did so
pub type ProteusError = super::wrapper::WrappedContextualError<ProteusErrorKind>;
/// Proteus produces these kinds of error
#[derive(Debug, thiserror::Error, strum::IntoStaticStr)]
pub enum ProteusErrorKind {
#[cfg(feature = "proteus")]
#[error(transparent)]
/// Error when decoding CBOR and/or decrypting Proteus messages
ProteusDecodeError(#[from] proteus_wasm::DecodeError),
#[cfg(feature = "proteus")]
#[error(transparent)]
/// Error when encoding CBOR and/or decrypting Proteus messages
ProteusEncodeError(#[from] proteus_wasm::EncodeError),
#[cfg(feature = "proteus")]
#[error(transparent)]
/// Various internal Proteus errors
ProteusInternalError(#[from] proteus_wasm::error::ProteusError),
#[cfg(feature = "proteus")]
#[error(transparent)]
/// Error when there's a critical error within a proteus Session
ProteusSessionError(#[from] proteus_wasm::session::Error<core_crypto_keystore::CryptoKeystoreError>),
/// Common errors we generate
#[cfg(feature = "proteus")]
#[error("{0}")]
Leaf(#[from] crate::LeafError),
}
impl ProteusErrorKind {
#[cfg(feature = "proteus")]
fn proteus_error_code(&self) -> Option<proteus_traits::ProteusErrorKind> {
use proteus_traits::ProteusErrorCode as _;
let mut out = match self {
ProteusErrorKind::ProteusDecodeError(decode_error) => Some(decode_error.code()),
ProteusErrorKind::ProteusEncodeError(encode_error) => Some(encode_error.code()),
ProteusErrorKind::ProteusInternalError(proteus_error) => Some(proteus_error.code()),
ProteusErrorKind::ProteusSessionError(session_error) => Some(session_error.code()),
ProteusErrorKind::Leaf(_) => None,
};
if out == Some(proteus_traits::ProteusErrorKind::None) {
out = None;
}
out
}
/// Returns the proteus error code
pub fn error_code(&self) -> Option<u16> {
cfg_if::cfg_if! {
if #[cfg(feature = "proteus")] {
self.proteus_error_code().map(|code| code as u16)
} else {
None
}
}
}
}