use std::{error, fmt, io::Error as IoError};
#[derive(Debug)]
pub enum Error {
Io(IoError),
InvalidPayload(DecodeError),
InvalidPublicKey(libp2p_identity::DecodingError),
InvalidPeerId(libp2p_identity::ParseError),
PeerIdMismatch,
}
#[derive(Debug)]
pub struct DecodeError(pub(crate) quick_protobuf_codec::Error);
impl fmt::Display for DecodeError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.0.fmt(f)
}
}
impl error::Error for DecodeError {
fn source(&self) -> Option<&(dyn error::Error + 'static)> {
self.0.source()
}
}
impl error::Error for Error {
fn cause(&self) -> Option<&dyn error::Error> {
match *self {
Error::Io(ref err) => Some(err),
Error::InvalidPayload(ref err) => Some(err),
Error::InvalidPublicKey(ref err) => Some(err),
Error::InvalidPeerId(ref err) => Some(err),
_ => None,
}
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
match self {
Error::Io(e) => write!(f, "I/O error: {e}"),
Error::InvalidPayload(_) => f.write_str("Failed to decode protobuf"),
Error::PeerIdMismatch => f.write_str(
"The peer id of the exchange isn't consistent with the remote public key",
),
Error::InvalidPublicKey(_) => f.write_str("Failed to decode public key"),
Error::InvalidPeerId(_) => f.write_str("Failed to decode PeerId"),
}
}
}
impl From<IoError> for Error {
fn from(err: IoError) -> Error {
Error::Io(err)
}
}
impl From<DecodeError> for Error {
fn from(err: DecodeError) -> Error {
Error::InvalidPayload(err)
}
}
impl From<libp2p_identity::DecodingError> for Error {
fn from(err: libp2p_identity::DecodingError) -> Error {
Error::InvalidPublicKey(err)
}
}
impl From<libp2p_identity::ParseError> for Error {
fn from(err: libp2p_identity::ParseError) -> Error {
Error::InvalidPeerId(err)
}
}