use async_compression::tokio::bufread::{GzipDecoder, XzDecoder, ZstdDecoder}; use clap::ArgEnum; use tokio::io::{AsyncRead, BufReader}; #[derive(Copy, Clone, PartialEq, Ord, PartialOrd, Eq, ArgEnum, Debug)] pub enum CompressionMode { AUTO, NONE, ZSTD, GZIP, XZ, } impl CompressionMode { pub fn parse(filename: &str) -> Self { if filename.to_ascii_lowercase().ends_with("zst") { return Self::ZSTD; } if filename.to_ascii_lowercase().ends_with("zstd") { return Self::ZSTD; } if filename.to_ascii_lowercase().ends_with("xz") { return Self::XZ; } if filename.to_ascii_lowercase().ends_with("gz") { return Self::GZIP; } return Self::NONE; } } pub async fn get_decompressed_reader( compression_mode: CompressionMode, reader: Box, ) -> anyhow::Result> { match compression_mode { CompressionMode::AUTO => unreachable!(), CompressionMode::NONE => Ok(Box::new(reader)), CompressionMode::ZSTD => { let reader = BufReader::new(reader); Ok(Box::new(ZstdDecoder::new(reader))) } CompressionMode::GZIP => { let reader = BufReader::new(reader); Ok(Box::new(GzipDecoder::new(reader))) } CompressionMode::XZ => { let reader = BufReader::new(reader); Ok(Box::new(XzDecoder::new(reader))) } } }