From 648828ae21a06bf03a39b86bb06149eff23fed67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn-Michael=20Miehe?= <40151420+ldericher@users.noreply.github.com> Date: Thu, 5 Jun 2025 11:20:27 +0000 Subject: [PATCH] main business logic almost done --- Cargo.lock | 135 ++++++++++++++++++++++++++++++++++++++++++++++-- Cargo.toml | 1 + src/appstate.rs | 16 +++--- src/main.rs | 37 ++++++++----- 4 files changed, 164 insertions(+), 25 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index acb8106..a3c72bd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -152,6 +152,19 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +[[package]] +name = "console" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" +dependencies = [ + "encode_unicode", + "libc", + "once_cell", + "unicode-width", + "windows-sys 0.59.0", +] + [[package]] name = "cookie" version = "0.18.1" @@ -209,6 +222,19 @@ dependencies = [ "powerfmt", ] +[[package]] +name = "dialoguer" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de" +dependencies = [ + "console", + "shell-words", + "tempfile", + "thiserror", + "zeroize", +] + [[package]] name = "dirs-next" version = "2.0.0" @@ -250,6 +276,12 @@ dependencies = [ "litrs", ] +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + [[package]] name = "env_filter" version = "0.1.3" @@ -279,6 +311,22 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +[[package]] +name = "errno" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + [[package]] name = "flate2" version = "1.1.1" @@ -312,7 +360,19 @@ checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", ] [[package]] @@ -513,6 +573,12 @@ dependencies = [ "libc", ] +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + [[package]] name = "litemap" version = "0.8.0" @@ -630,13 +696,19 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "redox_users" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom", + "getrandom 0.2.16", "libredox", "thiserror", ] @@ -678,12 +750,25 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.16", "libc", "untrusted", "windows-sys 0.52.0", ] +[[package]] +name = "rustix" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + [[package]] name = "rustls" version = "0.23.27" @@ -766,6 +851,12 @@ dependencies = [ "serde", ] +[[package]] +name = "shell-words" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" + [[package]] name = "shlex" version = "1.3.0" @@ -778,6 +869,7 @@ version = "0.1.0" dependencies = [ "clap", "ctrlc", + "dialoguer", "dirs-next", "env_logger", "log", @@ -832,6 +924,19 @@ dependencies = [ "syn", ] +[[package]] +name = "tempfile" +version = "3.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" +dependencies = [ + "fastrand", + "getrandom 0.3.3", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -899,6 +1004,12 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +[[package]] +name = "unicode-width" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" + [[package]] name = "untrusted" version = "0.9.0" @@ -979,6 +1090,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "webpki-roots" version = "0.26.11" @@ -1101,6 +1221,15 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", +] + [[package]] name = "writeable" version = "0.6.1" diff --git a/Cargo.toml b/Cargo.toml index 5b14233..2d59fc6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ description = "ShrUpl is a tool to upload files to a Sharry Instance through a p [dependencies] clap = { version = "4.5.38", features = ["derive"] } ctrlc = { version = "3.4.7", features = ["termination"] } +dialoguer = "0.11.0" dirs-next = "2.0.0" env_logger = "0.11.8" log = "0.4.27" diff --git a/src/appstate.rs b/src/appstate.rs index ba51491..ece0086 100644 --- a/src/appstate.rs +++ b/src/appstate.rs @@ -96,11 +96,7 @@ impl AppState { .start_upload(http, &self.alias, &self.share) .unwrap(), Some(FileState::U(uploading)) => uploading, - None => { - self.share.notify(http, &self.alias).unwrap(); - - return Ok(None); - } + None => return Ok(None), }; debug!("{uploading} chunk {chunk_size}"); @@ -116,7 +112,9 @@ impl AppState { } ChunkState::Finished(path) => { debug!("Finished {:?}!", path.display()); - Ok(Some(())) + self.share.notify(http, &self.alias).unwrap(); + + Ok(self.files.front().map(drop)) } } } @@ -128,14 +126,14 @@ impl AppState { let mut file = fs::File::create(&self.file_name)?; file.write_all(json.as_bytes())?; - trace!("successfully saved AppState"); + trace!("updated {:?}", self.file_name.display()); Ok(()) } pub fn clear(self) -> io::Result<()> { - fs::remove_file(self.file_name)?; + fs::remove_file(&self.file_name)?; - trace!("successfully cleared AppState"); + trace!("removed {:?}", self.file_name.display()); Ok(()) } } diff --git a/src/main.rs b/src/main.rs index b1dcc6b..e929a1a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,6 +11,7 @@ use std::{ }; use clap::Parser; +use dialoguer::{Confirm, theme::ColorfulTheme}; use log::{error, info}; use ureq::Agent; @@ -38,29 +39,39 @@ fn main() { .build() .into(); - let mut state = match AppState::try_resume(&args) { - Some(state) => state, - None => AppState::from_args(&args, &agent).unwrap_or_else(|e| { - error!("could not create new state: {e}"); - exit(1); - }), - }; + let mut state = AppState::try_resume(&args) + .and_then(|state| { + Confirm::with_theme(&ColorfulTheme::default()) + .with_prompt("Previous operation found, continue?") + .default(true) + .interact() + .map_or(None, |b| b.then_some(state)) + }) + .unwrap_or_else(|| match AppState::from_args(&args, &agent) { + Ok(state) => { + state.save().unwrap(); + state + } + Err(e) => { + error!("could not create new state: {e}"); + exit(1); + } + }); info!("continuing with state: {state:?}"); - state.save().unwrap(); loop { match state.upload_chunk(&agent, args.chunk_size * 1024 * 1024) { - Ok(None) => break, Err(e) => error!("error: {e:?}"), + Ok(None) => { + info!("all uploads done"); + state.clear().unwrap(); + break; + } _ => (), } state.save().unwrap(); - stop.load(Ordering::SeqCst).then(|| exit(0)); } - - info!("uploads done"); - state.clear().unwrap(); }