use thiserror::Error;
pub type Result<T> = std::result::Result<T, EnigmaProtocolError>;
#[derive(Debug, Error)]
pub enum EnigmaProtocolError {
#[error("invalid state")]
InvalidState,
#[error("unknown session")]
UnknownSession,
#[error("unable to decode packet")]
PacketDecode,
#[error("packet validation failed")]
PacketValidation,
#[error("cryptographic failure")]
Crypto,
#[error("transport failure")]
Transport,
#[error("attachment error")]
Attachment,
#[error("size limit exceeded")]
SizeLimitExceeded,
}
impl From<enigma_packet::EnigmaPacketError> for EnigmaProtocolError {
fn from(err: enigma_packet::EnigmaPacketError) -> Self {
use enigma_packet::EnigmaPacketError as PacketErr;
match err {
PacketErr::InvalidPacket(_) => EnigmaProtocolError::PacketDecode,
PacketErr::UnsupportedVersion(_) => EnigmaProtocolError::PacketValidation,
PacketErr::SizeLimitExceeded => EnigmaProtocolError::SizeLimitExceeded,
PacketErr::DecodeError(_) => EnigmaProtocolError::PacketDecode,
PacketErr::ValidationError(_) => EnigmaProtocolError::PacketValidation,
}
}
}
impl From<enigma_aead::EnigmaAeadError> for EnigmaProtocolError {
fn from(err: enigma_aead::EnigmaAeadError) -> Self {
use enigma_aead::EnigmaAeadError as AeadErr;
match err {
AeadErr::InvalidPacket(_) => EnigmaProtocolError::PacketDecode,
AeadErr::UnsupportedVersion(_) | AeadErr::UnsupportedAlgorithm(_) => {
EnigmaProtocolError::PacketValidation
}
AeadErr::AeadError | AeadErr::CryptoError => EnigmaProtocolError::Crypto,
AeadErr::SizeLimitExceeded => EnigmaProtocolError::SizeLimitExceeded,
}
}
}
impl From<std::io::Error> for EnigmaProtocolError {
fn from(_: std::io::Error) -> Self {
EnigmaProtocolError::Transport
}
}