diff --git a/Cargo.lock b/Cargo.lock index bb979e3..3f3ac99 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -352,6 +352,7 @@ dependencies = [ "color-eyre", "crossterm", "eyre", + "flate2", "indicatif", "rayon", "rust-lzma", diff --git a/Cargo.toml b/Cargo.toml index 49a134f..54ebeba 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,6 +10,7 @@ clap = "2.33.3" color-eyre = "0.6.2" crossterm = "0.27.0" eyre = "0.6.8" +flate2 = "1.0.27" indicatif = "0.17.6" rayon = "1.7.0" rust-lzma = "0.6.0" diff --git a/src/extractors.rs b/src/extractors.rs index ab03410..9916435 100644 --- a/src/extractors.rs +++ b/src/extractors.rs @@ -1,9 +1,10 @@ /* TODO_2: implement remaining extractor functions and write tests */ -use std::{fs::{self, File}, io, path::Path,}; +use std::{fs::{self, File}, io::{self, ErrorKind}, path::Path,}; use unrar::Archive; use lzma::reader::LzmaReader; +use flate2::read::GzDecoder; pub fn extract_zip(zip_file: &Path) -> io::Result<()> { let file = fs::File::open(zip_file)?; let mut archive = zip::ZipArchive::new(file)?; @@ -116,24 +117,42 @@ pub fn extract_xz(input_path: &Path, output_directory: &Path) -> Result<(), io:: Ok(()) } - pub fn extract_bz2(){} - pub fn extract_tbz2(){} - pub fn extract_tgz(){} - pub fn extract_txz(){} - pub fn extract_lzma(){} - pub fn extract_gz(){} - pub fn extract_z(){} - pub fn extract_7z(){} - pub fn extract_arj(){} - pub fn extract_cab(){} - pub fn extract_chm(){} - pub fn extract_deb(){} - pub fn extract_dmg(){} - pub fn extract_iso(){} - pub fn extract_lzh(){} - pub fn extract_msi(){} - pub fn extract_rpm(){} - pub fn extract_udf(){} - pub fn extract_wim(){} - pub fn extract_xar(){} - pub fn extract_exe(){} +pub fn extract_gz(input_path: &Path, output_directory: &Path) -> Result<(), io::Error> { + // Open the input GZ file + let input_file = File::open(input_path)?; + + // Create a GZ decompression reader + let mut decompressor = GzDecoder::new(input_file); + + // Determine the output file path + let output_file_path = output_directory.join(input_path.file_stem().unwrap()); + + // Create the output file + let mut output_file = File::create(&output_file_path)?; + + // Read from the decompressor and write to the output file + match io::copy(&mut decompressor, &mut output_file) { + Ok(_) => Ok(()), + Err(err) => Err(io::Error::new(ErrorKind::Other, err.to_string())), + } +} + // pub fn extract_bz2(){} + // pub fn extract_tbz2(){} + // pub fn extract_tgz(){} + // pub fn extract_txz(){} + // pub fn extract_lzma(){} + // pub fn extract_z(){} + // pub fn extract_7z(){} + // pub fn extract_arj(){} + // pub fn extract_cab(){} + // pub fn extract_chm(){} + // pub fn extract_deb(){} + // pub fn extract_dmg(){} + // pub fn extract_iso(){} + // pub fn extract_lzh(){} + // pub fn extract_msi(){} + // pub fn extract_rpm(){} + // pub fn extract_udf(){} + // pub fn extract_wim(){} + // pub fn extract_xar(){} + // pub fn extract_exe(){} diff --git a/src/main.rs b/src/main.rs index a183f3a..66ef317 100644 --- a/src/main.rs +++ b/src/main.rs @@ -23,7 +23,7 @@ use extractors::{ // extract_tgz, // extract_txz, // extract_lzma, - // extract_gz, + extract_gz, // extract_z, // extract_7z, // extract_arj, @@ -81,13 +81,14 @@ fn run() -> i32 { return 1; } } - /* "gz" => { - if let Err(err) = extract_gz(&fname) { + let output_directory = Path::new("output_directory"); // Change this to your desired output directory + if let Err(err) = extract_gz(&fname, &output_directory) { println!("Error extracting GZ: {}", err); return 1; } } + /* "bz2" => { if let Err(err) = extract_bz2(&fname) { println!("Error extracting BZ2: {}", err);