diff --git a/src/compression_engine.rs b/src/compression_engine.rs index 5c4060a..a9f197d 100755 --- a/src/compression_engine.rs +++ b/src/compression_engine.rs @@ -184,4 +184,57 @@ pub trait CompressionEngine { /// # Examples /// /// ``` - /// let engine \ No newline at end of file + /// let engine = /* some engine */; + /// let size = engine.size("file.gz".into()).unwrap(); + /// println!("Decompressed size: {} bytes", size); + /// ``` + fn size(&self, file_path: PathBuf) -> Result { + let mut reader = self.open(file_path)?; + let mut buffer = [0; libc::BUFSIZ as usize]; + let mut size: usize = 0; + + loop { + let n = reader.read(&mut buffer[..libc::BUFSIZ as usize])?; + if n == 0 { + debug!("COMPRESSION: EOF"); + break; + } + + size += n; + } + + Ok(size) + } +} + +lazy_static! { + /// Mapping of compression types to their external program implementations + pub static ref COMPRESSION_PROGRAMS: EnumMap> = enum_map! { + CompressionType::LZ4 => { + let program = CompressionEngineProgram::new("lz4", vec!["-c"], vec!["-d", "-c"]); + if program.supported { Some(program) } else { None } + }, + CompressionType::GZip => { + let program = CompressionEngineProgram::new("gzip", vec!["-c"], vec!["-d", "-c"]); + if program.supported { Some(program) } else { None } + }, + CompressionType::BZip2 => { + let program = CompressionEngineProgram::new("bzip2", vec!["-qcf"], vec!["-dcf"]); + if program.supported { Some(program) } else { None } + }, + CompressionType::XZ => { + let program = CompressionEngineProgram::new("xz", vec!["-qcf"], vec!["-dcf"]); + if program.supported { Some(program) } else { None } + }, + CompressionType::ZStd => { + let program = CompressionEngineProgram::new("zstd", vec!["-qcf"], vec!["-dcf"]); + if program.supported { Some(program) } else { None } + }, + CompressionType::None => None + }; +} + +/// Gets a compression engine for the specified compression type. +/// +/// Dynamically selects and instantiates the appropriate compression engine +/// based on feature flags \ No newline at end of file