From d9ea4356de7f57a91b7ee126eb503b9f93d96ddd Mon Sep 17 00:00:00 2001 From: Ruslan Isaev Date: Sun, 5 Jul 2026 18:23:01 +0300 Subject: [PATCH] working version --- Cargo.lock | 43 +------------------------------------ Cargo.toml | 9 +++++++- src/main.rs | 61 ++++++++++++++++++++++++++++++++++++----------------- 3 files changed, 51 insertions(+), 62 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a650158..dc88b7b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,12 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - [[package]] name = "anstream" version = "1.0.0" @@ -129,31 +123,12 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "crc32fast" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" -dependencies = [ - "cfg-if", -] - [[package]] name = "encode_unicode" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" -[[package]] -name = "flate2" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - [[package]] name = "futures-core" version = "0.3.32" @@ -188,7 +163,7 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" name = "imploder" version = "0.1.0" dependencies = [ - "flate2", + "clap", "pklib", "rawzip", ] @@ -229,16 +204,6 @@ version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", - "simd-adler32", -] - [[package]] name = "number_prefix" version = "0.4.0" @@ -310,12 +275,6 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" -[[package]] -name = "simd-adler32" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" - [[package]] name = "slab" version = "0.4.12" diff --git a/Cargo.toml b/Cargo.toml index f30940b..d4e38c4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,13 @@ version = "0.1.0" edition = "2024" [dependencies] -flate2 = "1.1.9" +clap = "4.6.1" pklib = "0.2.0" rawzip = "0.4.4" + +[profile.release] +codegen-units = 1 +lto = true +strip = true +panic = 'abort' +opt-level = 'z' \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index f94a0b5..cc2a1a6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,41 +1,61 @@ -use std::{fs::File, io::{Read, Write}}; -use flate2; +use std::{fs::{self, File}, io::{Read, Seek, Write}, time::UNIX_EPOCH}; use pklib; use rawzip::{ZipArchiveWriter, time::ZipDateTime}; +use clap::{Parser, Subcommand}; -fn implode_test() -> Result<(), Box> { - let data = b"Hello, world!"; - let modification_time = ZipDateTime::from_unix(1783257786); +const AFTER_TEST: &str = " +Examples: + imploder directory/ out.zip + please note that the contents of the \"directory\" will be at the root of the archive +"; + +#[derive(Parser)] +#[command(author, version, about, long_about = None)] +#[clap(after_help = AFTER_TEST)] +struct Args { + directory: String, + output_archive: String +} + +fn implode_test(input_dir: String, output_archive: String) -> Result<(), Box> { let mut output = Vec::new(); let mut archive = rawzip::ZipArchiveWriter::new(&mut output); - let (mut entry, config) = archive.new_file("test.txt") - .last_modified(modification_time) - .compression_method(rawzip::CompressionMethod::Terse) - .start()?; + let mut file_list = Vec::new(); + let dir_heh = std::fs::read_dir(input_dir)?; - let encoder = pklib::implode::ImplodeWriter::new(&mut entry, pklib::CompressionMode::Binary, pklib::DictionarySize::Size2K)?; + for file_path in dir_heh { + let shit = file_path.unwrap().path().display().to_string(); + file_list.push(shit); + } - let mut writer = config.wrap(encoder); + for mut file in file_list { + let mut curr_file = File::open(&file)?; + let mut buf: Vec = Vec::new(); + let byte_count = curr_file.read_to_end(&mut buf)?; - std::io::copy(&mut &data[..], &mut writer)?; + file = String::from(file.split('\\').last().unwrap()); + //println!("{}: {}", file, byte_count); + + let mod_time_unix = curr_file.metadata()?.modified()?.duration_since(UNIX_EPOCH)?.as_secs(); + let mod_time2 = ZipDateTime::from_unix(mod_time_unix.cast_signed()); + + println!("processing {}...", file); + process_file(&mut archive, &file.as_str(), mod_time2, &buf)?; + } - let (_, descriptor) = writer.finish()?; - let compressed = entry.finish(descriptor)?; archive.finish()?; - println!("{:?}", output); - { - let mut file = File::create("output.zip")?; + let mut file = File::create(output_archive)?; file.write_all(output.as_slice())?; } Ok::<(), Box>(()) } -fn process_file(mut archive: ZipArchiveWriter<&mut Vec>, filename: &str, modification_time: ZipDateTime, data) -> Result<(), Box> +fn process_file(archive: &mut ZipArchiveWriter<&mut Vec>, filename: &str, modification_time: ZipDateTime, data: &[u8]) -> Result<(), Box> { let (mut entry, config) = archive.new_file(filename) .last_modified(modification_time) @@ -49,12 +69,15 @@ fn process_file(mut archive: ZipArchiveWriter<&mut Vec>, filename: &str, mod std::io::copy(&mut &data[..], &mut writer)?; let (_, descriptor) = writer.finish()?; + let compressed = entry.finish(descriptor)?; Ok::<(), Box>(()) } fn main() -> Result<(), Box> { - implode_test(); + let args = Args::parse(); + + implode_test(args.directory, args.output_archive); Ok::<(), Box>(()) }