use crate::error::{Result, ZipError};
#[cfg(any(feature = "deflate", feature = "bzip2", feature = "zstd", feature = "lzma", feature = "xz"))]
use async_compression::Level;
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Compression {
Stored,
#[cfg(feature = "deflate")]
Deflate,
#[cfg(feature = "deflate64")]
Deflate64,
#[cfg(feature = "bzip2")]
Bz,
#[cfg(feature = "lzma")]
Lzma,
#[cfg(feature = "zstd")]
Zstd,
#[cfg(feature = "xz")]
Xz,
}
impl TryFrom<u16> for Compression {
type Error = ZipError;
fn try_from(value: u16) -> Result<Self> {
match value {
0 => Ok(Compression::Stored),
#[cfg(feature = "deflate")]
8 => Ok(Compression::Deflate),
#[cfg(feature = "deflate64")]
9 => Ok(Compression::Deflate64),
#[cfg(feature = "bzip2")]
12 => Ok(Compression::Bz),
#[cfg(feature = "lzma")]
14 => Ok(Compression::Lzma),
#[cfg(feature = "zstd")]
93 => Ok(Compression::Zstd),
#[cfg(feature = "xz")]
95 => Ok(Compression::Xz),
_ => Err(ZipError::CompressionNotSupported(value)),
}
}
}
impl From<&Compression> for u16 {
fn from(compression: &Compression) -> u16 {
match compression {
Compression::Stored => 0,
#[cfg(feature = "deflate")]
Compression::Deflate => 8,
#[cfg(feature = "deflate64")]
Compression::Deflate64 => 9,
#[cfg(feature = "bzip2")]
Compression::Bz => 12,
#[cfg(feature = "lzma")]
Compression::Lzma => 14,
#[cfg(feature = "zstd")]
Compression::Zstd => 93,
#[cfg(feature = "xz")]
Compression::Xz => 95,
}
}
}
impl From<Compression> for u16 {
fn from(compression: Compression) -> u16 {
(&compression).into()
}
}
#[derive(Debug, Clone, Copy)]
pub enum DeflateOption {
Normal,
Maximum,
Fast,
Super,
Other(i32),
}
#[cfg(any(feature = "deflate", feature = "bzip2", feature = "zstd", feature = "lzma", feature = "xz"))]
impl DeflateOption {
pub(crate) fn into_level(self) -> Level {
if let Self::Other(l) = self {
Level::Precise(l)
} else {
Level::Default
}
}
}