use std::{fmt, io};
#[cfg_attr(feature = "safe-encode", forbid(unsafe_code))]
pub(crate) mod compress;
#[cfg_attr(feature = "safe-decode", forbid(unsafe_code))]
pub(crate) mod decompress;
pub(crate) mod header;
pub use compress::{AutoFinishEncoder, FrameEncoder};
pub use decompress::FrameDecoder;
pub use header::{BlockMode, BlockSize, FrameInfo};
#[derive(Debug)]
#[non_exhaustive]
pub enum Error {
CompressionError(crate::block::CompressError),
DecompressionError(crate::block::DecompressError),
IoError(io::Error),
UnsupportedBlocksize(u8),
UnsupportedVersion(u8),
WrongMagicNumber,
ReservedBitsSet,
InvalidBlockInfo,
BlockTooBig,
HeaderChecksumError,
BlockChecksumError,
ContentChecksumError,
SkippableFrame(u32),
DictionaryNotSupported,
ContentLengthError {
expected: u64,
actual: u64,
},
}
impl From<Error> for io::Error {
fn from(e: Error) -> Self {
match e {
Error::IoError(e) => e,
Error::CompressionError(_)
| Error::DecompressionError(_)
| Error::SkippableFrame(_)
| Error::DictionaryNotSupported => io::Error::other(e),
Error::WrongMagicNumber
| Error::UnsupportedBlocksize(..)
| Error::UnsupportedVersion(..)
| Error::ReservedBitsSet
| Error::InvalidBlockInfo
| Error::BlockTooBig
| Error::HeaderChecksumError
| Error::ContentChecksumError
| Error::BlockChecksumError
| Error::ContentLengthError { .. } => io::Error::new(io::ErrorKind::InvalidData, e),
}
}
}
impl From<io::Error> for Error {
fn from(e: io::Error) -> Self {
match e.get_ref().map(|e| e.downcast_ref::<Error>()) {
Some(_) => *e.into_inner().unwrap().downcast::<Error>().unwrap(),
None => Error::IoError(e),
}
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> std::fmt::Result {
write!(f, "{self:?}")
}
}
impl std::error::Error for Error {}