use crate::formats::compression::CompressionCodec;
#[must_use]
pub fn compression_level_to_flate2(level: Option<u8>) -> flate2::Compression {
match level {
None | Some(6) => flate2::Compression::default(),
Some(1..=3) => flate2::Compression::fast(),
Some(7..=9) => flate2::Compression::best(),
Some(n) => flate2::Compression::new(u32::from(n)),
}
}
#[must_use]
pub fn compression_level_to_bzip2(level: Option<u8>) -> bzip2::Compression {
match level {
None | Some(6) => bzip2::Compression::default(),
Some(1) => bzip2::Compression::fast(),
Some(7..=9) => bzip2::Compression::best(),
Some(n @ 2..=6) => bzip2::Compression::new(u32::from(n)),
Some(n) => bzip2::Compression::new(u32::from(n.min(9))),
}
}
#[must_use]
pub fn compression_level_to_xz(level: Option<u8>) -> u32 {
match level {
None | Some(6) => 6,
Some(n) => u32::from(n),
}
}
#[allow(clippy::match_same_arms)] #[must_use]
pub fn compression_level_to_zstd(level: Option<u8>) -> i32 {
match level {
None | Some(6) => 3,
Some(1) => 1,
Some(2) => 2,
Some(7) => 10,
Some(8) => 15,
Some(9) => 19,
_ => 3,
}
}
#[must_use]
pub fn convert_compression_level(codec: CompressionCodec, level: Option<u8>) -> CompressionLevel {
match codec {
CompressionCodec::Gzip => CompressionLevel::Flate2(compression_level_to_flate2(level)),
CompressionCodec::Bzip2 => CompressionLevel::Bzip2(compression_level_to_bzip2(level)),
CompressionCodec::Xz => CompressionLevel::Xz(compression_level_to_xz(level)),
CompressionCodec::Zstd => CompressionLevel::Zstd(compression_level_to_zstd(level)),
}
}
#[derive(Debug, Clone, Copy)]
pub enum CompressionLevel {
Flate2(flate2::Compression),
Bzip2(bzip2::Compression),
Xz(u32),
Zstd(i32),
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_compression_level_to_flate2() {
let level = compression_level_to_flate2(None);
assert_eq!(level, flate2::Compression::default());
let level = compression_level_to_flate2(Some(6));
assert_eq!(level, flate2::Compression::default());
let level = compression_level_to_flate2(Some(1));
assert_eq!(level, flate2::Compression::fast());
let level = compression_level_to_flate2(Some(9));
assert_eq!(level, flate2::Compression::best());
let level = compression_level_to_flate2(Some(5));
assert_eq!(level, flate2::Compression::new(5));
}
#[test]
fn test_compression_level_to_bzip2() {
let level = compression_level_to_bzip2(None);
assert_eq!(level, bzip2::Compression::default());
let level = compression_level_to_bzip2(Some(1));
assert_eq!(level, bzip2::Compression::fast());
let level = compression_level_to_bzip2(Some(9));
assert_eq!(level, bzip2::Compression::best());
let level = compression_level_to_bzip2(Some(4));
assert_eq!(level, bzip2::Compression::new(4));
}
#[test]
fn test_compression_level_to_xz() {
assert_eq!(compression_level_to_xz(None), 6);
assert_eq!(compression_level_to_xz(Some(6)), 6);
assert_eq!(compression_level_to_xz(Some(1)), 1);
assert_eq!(compression_level_to_xz(Some(9)), 9);
}
#[test]
fn test_compression_level_to_zstd() {
assert_eq!(compression_level_to_zstd(None), 3);
assert_eq!(compression_level_to_zstd(Some(6)), 3);
assert_eq!(compression_level_to_zstd(Some(1)), 1);
assert_eq!(compression_level_to_zstd(Some(2)), 2);
assert_eq!(compression_level_to_zstd(Some(7)), 10);
assert_eq!(compression_level_to_zstd(Some(8)), 15);
assert_eq!(compression_level_to_zstd(Some(9)), 19);
}
#[test]
fn test_convert_compression_level() {
let level = convert_compression_level(CompressionCodec::Gzip, Some(9));
match level {
CompressionLevel::Flate2(c) => {
assert_eq!(c, flate2::Compression::best());
}
_ => panic!("Expected Flate2 compression level"),
}
let level = convert_compression_level(CompressionCodec::Zstd, None);
match level {
CompressionLevel::Zstd(c) => {
assert_eq!(c, 3);
}
_ => panic!("Expected Zstd compression level"),
}
}
}