mod brotli;
mod bzip2;
mod containers;
mod gzip;
mod lz4;
mod lzma;
mod pipeline;
mod sevenz;
mod snappy;
mod stream;
mod tar;
mod xz;
mod zip;
mod zstd;
pub use brotli::{Brotli, BrotliArgs};
pub use bzip2::{Bzip2, Bzip2Args};
pub use gzip::{Gzip, GzipArgs};
pub use lz4::{Lz4, Lz4Args};
pub use lzma::{Lzma, LzmaArgs};
pub use pipeline::Pipeline;
pub use sevenz::{SevenZ, SevenZArgs};
pub use snappy::{Snappy, SnappyArgs};
pub use tar::{Tar, TarArgs};
pub use xz::{Xz, XzArgs};
pub use zip::{Zip, ZipArgs};
pub use zstd::{Zstd, ZstdArgs};
use crate::utils::Compressor;
pub fn compressor_from_str(s: &str) -> Option<Box<dyn Compressor>> {
match s {
"tar" => Some(Box::<Tar>::default()),
"gzip" | "gz" => Some(Box::<Gzip>::default()),
"xz" => Some(Box::<Xz>::default()),
"bzip2" | "bz2" => Some(Box::<Bzip2>::default()),
"zip" => Some(Box::<Zip>::default()),
"zstd" | "zst" => Some(Box::<Zstd>::default()),
"lz4" => Some(Box::<Lz4>::default()),
"brotli" | "br" => Some(Box::<Brotli>::default()),
"snappy" | "sz" => Some(Box::<Snappy>::default()),
"lzma" => Some(Box::<Lzma>::default()),
"7z" | "sevenz" => Some(Box::<SevenZ>::default()),
_ => None,
}
}
pub fn chain_from_ext(ext: &str) -> Option<Vec<Box<dyn Compressor>>> {
match ext {
"tgz" => Some(vec![Box::<Tar>::default(), Box::<Gzip>::default()]),
"tbz" | "tbz2" => Some(vec![Box::<Tar>::default(), Box::<Bzip2>::default()]),
"txz" => Some(vec![Box::<Tar>::default(), Box::<Xz>::default()]),
"tzst" => Some(vec![Box::<Tar>::default(), Box::<Zstd>::default()]),
_ => compressor_from_str(ext).map(|c| vec![c]),
}
}
pub fn chain_from_format_str(s: &str) -> Option<Vec<Box<dyn Compressor>>> {
let mut chain = Vec::new();
for part in s.split('.') {
chain.extend(chain_from_ext(part)?);
}
if chain.is_empty() { None } else { Some(chain) }
}