#![forbid(unsafe_code)]
#![doc = include_str!("../README.md")]
#[cfg(feature = "brotli")]
pub use use_brotli as brotli;
#[cfg(feature = "bzip2")]
pub use use_bzip2 as bzip2;
#[cfg(feature = "gzip")]
pub use use_gzip as gzip;
#[cfg(feature = "lz4")]
pub use use_lz4 as lz4;
#[cfg(feature = "xz")]
pub use use_xz as xz;
#[cfg(feature = "zstd")]
pub use use_zstd as zstd;
#[derive(Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub enum CompressionLevel {
Fastest,
#[default]
Balanced,
Best,
Numeric(u32),
}
impl CompressionLevel {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::Fastest => "fastest",
Self::Balanced => "balanced",
Self::Best => "best",
Self::Numeric(_) => "numeric",
}
}
#[must_use]
pub const fn numeric(self) -> Option<u32> {
match self {
Self::Numeric(level) => Some(level),
Self::Fastest | Self::Balanced | Self::Best => None,
}
}
}
#[derive(Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub enum CompressionIntent {
Speed,
Size,
#[default]
Balanced,
Compatibility,
}
impl CompressionIntent {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::Speed => "speed",
Self::Size => "size",
Self::Balanced => "balanced",
Self::Compatibility => "compatibility",
}
}
}
#[derive(Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct CompressionSettings {
pub level: CompressionLevel,
pub intent: CompressionIntent,
}
impl CompressionSettings {
#[must_use]
pub const fn new(level: CompressionLevel, intent: CompressionIntent) -> Self {
Self { level, intent }
}
}
#[cfg(test)]
mod tests {
use super::{CompressionIntent, CompressionLevel, CompressionSettings};
#[test]
fn describes_level_and_intent() {
let settings =
CompressionSettings::new(CompressionLevel::Numeric(9), CompressionIntent::Size);
assert_eq!(settings.level.as_str(), "numeric");
assert_eq!(settings.level.numeric(), Some(9));
assert_eq!(settings.intent.as_str(), "size");
}
#[cfg(all(
feature = "bzip2",
feature = "brotli",
feature = "gzip",
feature = "lz4"
))]
#[test]
fn exposes_codec_namespaces() {
assert!(super::bzip2::is_bzip2_filename("bundle.tar.bz2"));
assert!(super::brotli::is_brotli_filename("bundle.tar.br"));
assert_eq!(super::gzip::GZIP_EXTENSION, "gz");
assert!(super::lz4::is_lz4_filename("bundle.tar.lz4"));
}
}