use crate::io::WireType;
use std::fmt::{Display, Formatter};
use std::string::FromUtf8Error;
#[derive(Debug)]
pub enum DecodingError {
Stream(std::io::Error),
InvalidWireType {
semantic: &'static str,
wire: WireType,
},
ValueOutOfRange,
LengthPrefixOutOfRange,
InvalidPacket(enc::Error),
PacketUnderRead { declared: usize, unread: usize },
InvalidBool(u8),
InvalidString(FromUtf8Error),
}
impl DecodingError {
pub fn from_var_int_error(error: enc::Error) -> Self {
match error {
enc::Error::Stream(error) => Self::Stream(error),
_ => Self::ValueOutOfRange,
}
}
pub fn from_length_prefix_error(error: enc::Error) -> Self {
match error {
enc::Error::Stream(error) => Self::Stream(error),
_ => Self::LengthPrefixOutOfRange,
}
}
pub fn from_packet_error(error: enc::Error) -> Self {
match error {
enc::Error::Stream(error) => Self::Stream(error),
_ => Self::InvalidPacket(error),
}
}
}
impl From<std::io::Error> for DecodingError {
fn from(error: std::io::Error) -> Self {
Self::Stream(error)
}
}
impl From<DecodingError> for enc::Error {
fn from(error: DecodingError) -> Self {
match error {
DecodingError::Stream(error) => error.into(),
_ => enc::Error::InvalidEncodedData {
reason: Some(Box::new(error)),
},
}
}
}
impl Display for DecodingError {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?}", self)
}
}
impl std::error::Error for DecodingError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
Self::Stream(error) => Some(error),
Self::InvalidPacket(error) => Some(error),
Self::InvalidString(error) => Some(error),
Self::InvalidWireType { .. }
| Self::ValueOutOfRange
| Self::LengthPrefixOutOfRange
| Self::PacketUnderRead { .. }
| Self::InvalidBool(_) => None,
}
}
}