From 3e2a9bb476030a05ea64756da65a974ec5acebb1 Mon Sep 17 00:00:00 2001 From: Daniel Eades Date: Tue, 23 Feb 2021 07:23:05 +0000 Subject: [PATCH 1/2] a quick sketch of some ideas --- Cargo.lock | 178 ++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 3 +- src/chunk_iterator.rs | 41 ++++++++++ src/main.rs | 56 +++++++------ 4 files changed, 252 insertions(+), 26 deletions(-) create mode 100644 src/chunk_iterator.rs diff --git a/Cargo.lock b/Cargo.lock index c3d95d9..1343dc5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "aho-corasick" version = "0.7.15" @@ -9,6 +11,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "ansi_term" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +dependencies = [ + "winapi", +] + [[package]] name = "assert_cmd" version = "1.0.3" @@ -37,6 +48,17 @@ dependencies = [ "tempfile", ] +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + [[package]] name = "autocfg" version = "1.0.1" @@ -90,6 +112,21 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17cc5e6b5ab06331c33589842070416baa137e8b0eb912b008cfd4a78ada7919" +[[package]] +name = "clap" +version = "2.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" +dependencies = [ + "ansi_term", + "atty", + "bitflags", + "strsim", + "textwrap", + "unicode-width", + "vec_map", +] + [[package]] name = "crossbeam-utils" version = "0.8.2" @@ -177,6 +214,24 @@ dependencies = [ "walkdir", ] +[[package]] +name = "heck" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cbf45460356b7deeb5e3415b5563308c0a9b057c85e12b06ad551f98d0a6ac" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "hermit-abi" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" +dependencies = [ + "libc", +] + [[package]] name = "ignore" version = "0.4.17" @@ -333,6 +388,39 @@ dependencies = [ "treeline", ] +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +dependencies = [ + "unicode-xid", +] + [[package]] name = "qrcode" version = "0.11.2" @@ -353,6 +441,16 @@ dependencies = [ "predicates", "qrcode", "rand", + "structopt", +] + +[[package]] +name = "quote" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +dependencies = [ + "proc-macro2", ] [[package]] @@ -479,6 +577,47 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[package]] +name = "structopt" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5277acd7ee46e63e5168a80734c9f6ee81b1367a7d8772a2d765df2a3705d28c" +dependencies = [ + "clap", + "lazy_static", + "structopt-derive", +] + +[[package]] +name = "structopt-derive" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ba9cdfda491b814720b6b06e0cac513d922fc407582032e8706e9f137976f90" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "syn" +version = "1.0.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c700597eca8a5a762beb35753ef6b94df201c81cca676604f547495a0d7f0081" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + [[package]] name = "tempfile" version = "3.2.0" @@ -493,6 +632,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + [[package]] name = "thread_local" version = "1.1.3" @@ -508,6 +656,36 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7f741b240f1a48843f9b8e0444fb55fb2a4ff67293b50a9179dfd5ea67f8d41" +[[package]] +name = "unicode-segmentation" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" + +[[package]] +name = "unicode-width" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" + +[[package]] +name = "unicode-xid" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "version_check" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" + [[package]] name = "wait-timeout" version = "0.2.0" diff --git a/Cargo.toml b/Cargo.toml index 5b8fdfd..0a5e600 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,9 +9,10 @@ edition = "2018" [dependencies] qrcode = "0.11" base64 = "0.13.0" +structopt = "0.3.21" [dev-dependencies] rand = "0.8.3" assert_cmd = "1.0.3" assert_fs = "1.0.1" -predicates = "1.0.7" \ No newline at end of file +predicates = "1.0.7" diff --git a/src/chunk_iterator.rs b/src/chunk_iterator.rs new file mode 100644 index 0000000..9a5cfbc --- /dev/null +++ b/src/chunk_iterator.rs @@ -0,0 +1,41 @@ +use std::io::{BufRead, Read}; + +use std::io; + +pub struct ChunkIterator +where + T: Read, +{ + reader: T, + chunk_size: u64, +} + +impl ChunkIterator +where + T: Read, +{ + pub fn new(reader: T, chunk_size: u64) -> Self { + Self { reader, chunk_size } + } +} + +impl Iterator for ChunkIterator +where + T: BufRead, +{ + type Item = io::Result>; + + fn next(&mut self) -> Option { + let mut buf = Vec::default(); + match self + .reader + .by_ref() + .take(self.chunk_size) + .read_to_end(&mut buf) + { + Ok(0) => None, + Ok(_n) => Some(Ok(buf)), + Err(e) => Some(Err(e)), + } + } +} diff --git a/src/main.rs b/src/main.rs index 0b1e322..8af634e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,32 +1,39 @@ -use std::env; -use std::fs; +#![feature(seek_stream_len)] +#![warn(clippy::pedantic)] + use std::io::Read; use std::io::Write; +use std::io::{BufRead, BufReader}; +use std::{fs, path::PathBuf}; // use std::io::{BufRead, BufReader}; use std::io::{Seek, SeekFrom}; -use std::path::Path; use std::process; extern crate base64; +mod chunk_iterator; +use structopt::StructOpt; + +#[derive(Debug, StructOpt)] +pub struct Args { + #[structopt(short, long = "input")] + pub input_file: PathBuf, + #[structopt(short, long = "output")] + pub output_directory: PathBuf, +} + fn main() { + let args = Args::from_args(); // Check arguments for file to open - let args: Vec = env::args().collect(); - if args.len() < 3 { - let binary_name = &args[0]; - println!("Usage: {} FILE_TO_SEND OUTPUT_FOLDER", binary_name); - process::exit(1); - } - let input_filename = &args[1]; - let output_folder = &args[2]; + let input_filename = args.input_file; let mut file = match fs::File::open(input_filename) { Ok(f) => f, Err(err) => panic!("File error: {}", err), }; // Ensure output folder exists - fs::create_dir_all(output_folder).expect("Could not create/check output folder"); - let output_path = Path::new(output_folder); + fs::create_dir_all(&args.output_directory).expect("Could not create/check output folder"); + let output_path = args.output_directory.join("input_b64.txt"); // Create a base64 version of our file let mut base64_file = match fs::File::create(output_path.join("input_b64.txt")) { Ok(f) => f, @@ -63,18 +70,17 @@ fn main() { .sync_all() .expect("Error syncing base64 file to disks"); - // let base64_filesize_bytes = base64_file - // .stream_len() - // .expect("Error checking base64 filesize"); + let base64_filesize_bytes = base64_file + .stream_len() + .expect("Error checking base64 filesize"); - // let chunk_reader; - // let chunk_read; - // { - // chunk_reader = BufReader::with_capacity(1024, base64_file); + let mut chunk_reader; + let chunk_read; + { + chunk_reader = BufReader::with_capacity(1024, base64_file); - // chunk_read = chunk_reader - // .fill_buf() - // .expect("Error reading chunk off base64 file"); - // } - // println!("Read {:?} bytes: {:?}", chunk_read, chunk_reader); + chunk_read = chunk_reader + .fill_buf() + .expect("Error reading chunk off base64 file"); + } } From 24f43642912bf67fc14f9950a8f7930206c949b7 Mon Sep 17 00:00:00 2001 From: Daniel Eades Date: Tue, 23 Feb 2021 07:30:13 +0000 Subject: [PATCH 2/2] add 'deny' lints --- src/main.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main.rs b/src/main.rs index 8af634e..79a9d12 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ #![feature(seek_stream_len)] #![warn(clippy::pedantic)] +#![deny(missing_docs, missing_debug_implementations, clippy::all)] use std::io::Read; use std::io::Write;