From fa2fb675de38a13e088821846e18350b3c1ebcf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Rodrigues=20Miguel?= Date: Tue, 23 Mar 2021 01:06:57 -0300 Subject: [PATCH] WIP Tar compression --- Cargo.lock | 30 +++++++++++++++++++++ Cargo.toml | 1 + src/compressors/compressor.rs | 5 ++-- src/compressors/mod.rs | 5 ++++ src/compressors/tar.rs | 42 ++++++++++++++++++++++++++++++ src/main.rs | 49 ++++++++++++++++++++++++----------- 6 files changed, 115 insertions(+), 17 deletions(-) create mode 100644 src/compressors/tar.rs diff --git a/Cargo.lock b/Cargo.lock index 1b5fa10..fbf8289 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -326,6 +326,7 @@ dependencies = [ "colored", "niffler", "tar", + "walkdir", "zip", ] @@ -368,6 +369,15 @@ version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + [[package]] name = "strsim" version = "0.8.0" @@ -466,6 +476,17 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" +[[package]] +name = "walkdir" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" +dependencies = [ + "same-file", + "winapi", + "winapi-util", +] + [[package]] name = "wasi" version = "0.10.0+wasi-snapshot-preview1" @@ -488,6 +509,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" diff --git a/Cargo.toml b/Cargo.toml index d905538..2a0317e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,6 +9,7 @@ edition = "2018" [dependencies] colored = "2.0.0" niffler = "2.3.1" +walkdir = "2.3.2" clap = "2.33.3" zip = "0.5.11" tar = "0.4.33" \ No newline at end of file diff --git a/src/compressors/compressor.rs b/src/compressors/compressor.rs index 2530085..4ca801f 100644 --- a/src/compressors/compressor.rs +++ b/src/compressors/compressor.rs @@ -3,12 +3,13 @@ use std::path::PathBuf; use crate::{error::OuchResult, file::File}; pub enum CompressionResult { - FilesUnpacked(Vec), + ZipArchive(Vec), + TarArchive(Vec), FileInMemory(Vec) } pub trait Compressor { - fn compress(&self, from: Vec, into: &Option) -> OuchResult; + fn compress(&self, from: Vec) -> OuchResult; } // diff --git a/src/compressors/mod.rs b/src/compressors/mod.rs index e69de29..7d48bca 100644 --- a/src/compressors/mod.rs +++ b/src/compressors/mod.rs @@ -0,0 +1,5 @@ +mod tar; +mod compressor; + +pub use compressor::{Compressor, CompressionResult}; +pub use self::tar::TarCompressor; \ No newline at end of file diff --git a/src/compressors/tar.rs b/src/compressors/tar.rs new file mode 100644 index 0000000..572118c --- /dev/null +++ b/src/compressors/tar.rs @@ -0,0 +1,42 @@ +use std::{fs::File, path::Path}; + +use tar::Builder; +use walkdir::WalkDir; + +use crate::{decompressors::TarDecompressor, error::OuchResult}; +use crate::compressors::Compressor; +use super::compressor::CompressionResult; + +pub struct TarCompressor {} + +impl TarCompressor { + fn make_archive_in_memory(input_files: Vec) -> OuchResult> { + + let buf = Vec::new(); + let mut b = Builder::new(buf); + + for file in input_files { + for entry in WalkDir::new(&file.path) { + let entry = entry.unwrap(); + let path = entry.path(); + if path.is_dir() { + continue; + } + b.append_file(path, &mut File::open(path).unwrap()).unwrap(); + } + } + + + Ok(b.into_inner()?) + } +} + +impl Compressor for TarCompressor { + fn compress(&self, from: Vec) -> OuchResult { + Ok(CompressionResult::TarArchive( + TarCompressor::make_archive_in_memory(from)? + )) + } +} + +// fn compress(&self, from: Vec, into: &Option) -> OuchResult; \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 8a2f942..046089d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ -use std::convert::TryFrom; +use std::{convert::TryFrom, fs, path::{Path, PathBuf}}; use colored::Colorize; @@ -13,24 +13,43 @@ mod utils; mod compressors; mod decompressors; +use compressors::{CompressionResult, Compressor, TarCompressor}; use error::OuchResult; +use file::File; fn main() -> OuchResult<()>{ - let print_error = |err| { - println!("{}: {}", "error".red(), err); + // let print_error = |err| { + // println!("{}: {}", "error".red(), err); + // }; + // let matches = cli::get_matches(); + // match cli::Command::try_from(matches) { + // Ok(command) => { + // match evaluator::Evaluator::evaluate(command) { + // Ok(_) => {}, + // Err(err) => print_error(err) + // } + // } + // Err(err) => { + // print_error(err) + // } + // } + + let compressor = TarCompressor {}; + + let file = File { + path: PathBuf::from("target"), + contents: None, + extension: None, }; - let matches = cli::get_matches(); - match cli::Command::try_from(matches) { - Ok(command) => { - match evaluator::Evaluator::evaluate(command) { - Ok(_) => {}, - Err(err) => print_error(err) - } - } - Err(err) => { - print_error(err) - } - } + + let ok = compressor.compress(vec![file])?; + + let ok = match ok { + CompressionResult::TarArchive(bytes) => bytes, + _ => unreachable!() + }; + + fs::write(Path::new("great.tar"), ok)?; Ok(()) }