1use thiserror::Error;
2
3pub type Result<T> = std::result::Result<T, EnigmaProtocolError>;
4
5#[derive(Debug, Error)]
6pub enum EnigmaProtocolError {
7 #[error("invalid state")]
8 InvalidState,
9 #[error("unknown session")]
10 UnknownSession,
11 #[error("unable to decode packet")]
12 PacketDecode,
13 #[error("packet validation failed")]
14 PacketValidation,
15 #[error("cryptographic failure")]
16 Crypto,
17 #[error("transport failure")]
18 Transport,
19 #[error("attachment error")]
20 Attachment,
21 #[error("size limit exceeded")]
22 SizeLimitExceeded,
23}
24
25impl From<enigma_packet::EnigmaPacketError> for EnigmaProtocolError {
26 fn from(err: enigma_packet::EnigmaPacketError) -> Self {
27 use enigma_packet::EnigmaPacketError as PacketErr;
28 match err {
29 PacketErr::InvalidPacket(_) => EnigmaProtocolError::PacketDecode,
30 PacketErr::UnsupportedVersion(_) => EnigmaProtocolError::PacketValidation,
31 PacketErr::SizeLimitExceeded => EnigmaProtocolError::SizeLimitExceeded,
32 PacketErr::DecodeError(_) => EnigmaProtocolError::PacketDecode,
33 PacketErr::ValidationError(_) => EnigmaProtocolError::PacketValidation,
34 }
35 }
36}
37
38impl From<enigma_aead::EnigmaAeadError> for EnigmaProtocolError {
39 fn from(err: enigma_aead::EnigmaAeadError) -> Self {
40 use enigma_aead::EnigmaAeadError as AeadErr;
41 match err {
42 AeadErr::InvalidPacket(_) => EnigmaProtocolError::PacketDecode,
43 AeadErr::UnsupportedVersion(_) | AeadErr::UnsupportedAlgorithm(_) => {
44 EnigmaProtocolError::PacketValidation
45 }
46 AeadErr::AeadError | AeadErr::CryptoError => EnigmaProtocolError::Crypto,
47 AeadErr::SizeLimitExceeded => EnigmaProtocolError::SizeLimitExceeded,
48 }
49 }
50}
51
52impl From<std::io::Error> for EnigmaProtocolError {
53 fn from(_: std::io::Error) -> Self {
54 EnigmaProtocolError::Transport
55 }
56}