use core::fmt;
use framing_sv2::Error as FramingError;
#[cfg(feature = "noise_sv2")]
use noise_sv2::{AeadError, Error as NoiseError};
pub type Result<T> = core::result::Result<T, Error>;
#[derive(Debug, PartialEq, Eq)]
pub enum Error {
#[cfg(feature = "noise_sv2")]
AeadError(AeadError),
BinarySv2Error(binary_sv2::Error),
FramingError(FramingError),
FramingSv2Error(framing_sv2::Error),
#[cfg(feature = "noise_sv2")]
InvalidStepForInitiator,
#[cfg(feature = "noise_sv2")]
InvalidStepForResponder,
MissingBytes(usize),
#[cfg(feature = "noise_sv2")]
NoiseSv2Error(NoiseError),
#[cfg(feature = "noise_sv2")]
NotInHandShakeState,
UnexpectedNoiseState,
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
use Error::*;
match self {
#[cfg(feature = "noise_sv2")]
AeadError(e) => write!(f, "Aead Error: `{e:?}`"),
BinarySv2Error(e) => write!(f, "Binary Sv2 Error: `{e:?}`"),
FramingError(e) => write!(f, "Framing error in codec: `{e:?}`"),
FramingSv2Error(e) => write!(f, "Framing Sv2 Error: `{e:?}`"),
#[cfg(feature = "noise_sv2")]
InvalidStepForInitiator => write!(
f,
"This noise handshake step can not be executed by an initiato"
),
#[cfg(feature = "noise_sv2")]
InvalidStepForResponder => write!(
f,
"This noise handshake step can not be executed by a responder"
),
MissingBytes(u) => write!(f, "Missing `{u}` Noise bytes"),
#[cfg(feature = "noise_sv2")]
NoiseSv2Error(e) => match e {
NoiseError::InvalidCertificate(msg) => {
write!(f, "Invalid Certificate: {}", msg)
}
other => {
write!(f, "Noise SV2 Error: {:?}", other)
}
},
#[cfg(feature = "noise_sv2")]
NotInHandShakeState => write!(
f,
"This operation can be executed only during the noise handshake"
),
UnexpectedNoiseState => {
write!(f, "Noise state is incorrect")
}
}
}
}
#[cfg(feature = "noise_sv2")]
impl From<AeadError> for Error {
fn from(e: AeadError) -> Self {
Error::AeadError(e)
}
}
impl From<binary_sv2::Error> for Error {
fn from(e: binary_sv2::Error) -> Self {
Error::BinarySv2Error(e)
}
}
impl From<framing_sv2::Error> for Error {
fn from(e: framing_sv2::Error) -> Self {
Error::FramingSv2Error(e)
}
}
#[cfg(feature = "noise_sv2")]
impl From<NoiseError> for Error {
fn from(e: NoiseError) -> Self {
Error::NoiseSv2Error(e)
}
}