use thiserror::Error;
use crate::decompress::Decompressor;
#[cfg(feature = "deflate")]
use crate::decompress::deflate::DeflateDecompressor;
pub mod cd_location;
pub mod file_header;
pub mod central_directory;
pub mod local_file_header;
#[derive(Error, Debug)]
pub enum DecompressorCreationError {
#[error("unknown compression method: {0}")]
UnknownMethod(u16)
}
#[derive(Debug, Clone)]
pub enum CompressionMethod {
#[cfg(feature = "deflate")]
Deflate,
Unknown(u16)
}
impl CompressionMethod {
pub fn from_id(id: u16) -> Option<Self> {
match id {
0 => None,
#[cfg(feature = "deflate")]
8 => Some(Self::Deflate),
_ => Some(Self::Unknown(id))
}
}
pub fn create_decompressor(&self) -> Result<Box<dyn Decompressor>, DecompressorCreationError> {
match self {
#[cfg(feature = "deflate")]
Self::Deflate => Ok(Box::new(DeflateDecompressor::new())),
Self::Unknown(id) => Err(DecompressorCreationError::UnknownMethod(*id))
}
}
pub fn is_supported(&self) -> bool {
!(matches!(self, Self::Unknown(..)))
}
}