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
            }
        }
    }
}