use crate::fse;
use crate::vn;
use std::error;
use std::fmt;
use std::io;
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Debug)]
#[non_exhaustive]
pub enum Error {
Io(io::Error),
Fse(fse::FseErrorKind),
Vn(vn::VnErrorKind),
BadBlock(u32),
BadBitStream,
BadDValue,
BadReaderState,
BufferOverflow,
PayloadOverflow,
PayloadUnderflow,
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> std::result::Result<(), fmt::Error> {
match self {
Self::Io(e) => write!(f, "IO: {e}"),
Self::Fse(e) => write!(f, "FSE: {e}"),
Self::Vn(e) => write!(f, "VN: {e}"),
Self::BadBitStream => write!(f, "bad bitstream"),
Self::BadDValue => write!(f, "bad D value"),
Self::BadBlock(u) => write!(f, "bad block: 0x{u:08X}"),
Self::BadReaderState => write!(f, "bad reader state"),
Self::BufferOverflow => write!(f, "buffer overflow"),
Self::PayloadOverflow => write!(f, "bad payload overflow"),
Self::PayloadUnderflow => write!(f, "bad payload underflow"),
}
}
}
impl error::Error for Error {
fn source(&self) -> Option<&(dyn error::Error + 'static)> {
match self {
Self::Io(e) => Some(e),
_ => None,
}
}
}
impl From<fse::FseErrorKind> for Error {
fn from(err: fse::FseErrorKind) -> Error {
Error::Fse(err)
}
}
impl From<vn::VnErrorKind> for Error {
fn from(err: vn::VnErrorKind) -> Error {
Error::Vn(err)
}
}
impl From<io::Error> for Error {
fn from(err: io::Error) -> Error {
Error::Io(err)
}
}
impl From<Error> for io::Error {
fn from(err: Error) -> Self {
match err {
Error::Io(e) => e,
err => io::Error::new(io::ErrorKind::InvalidData, err),
}
}
}