enigma-protocol 0.1.0

High-level orchestrator that composes the Enigma crates into a production-ready messaging protocol
Documentation
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
    }
}