Add warning to vpv if no input is given

This commit is contained in:
Alexandre Bury 2019-05-15 12:18:26 -07:00
parent 859c12320f
commit 5ee7e11619
2 changed files with 97 additions and 85 deletions

View File

@ -76,6 +76,7 @@ signal-hook = "0.1.8"
[dev-dependencies] [dev-dependencies]
rand = "0.6.5" rand = "0.6.5"
pretty-bytes = "0.2.2" pretty-bytes = "0.2.2"
atty = "0.2.11"
[features] [features]
blt-backend = ["bear-lib-terminal"] blt-backend = ["bear-lib-terminal"]

View File

@ -1,6 +1,3 @@
extern crate cursive;
extern crate pretty_bytes;
use std::io; use std::io;
use cursive::traits::{Boxable, With}; use cursive::traits::{Boxable, With};
@ -25,7 +22,7 @@ fn main() {
let start = time::Instant::now(); let start = time::Instant::now();
// If an argument is given, it is the file we'll read from. // If an argument is given, it is the file we'll read from.
// Else, read from stdin. // Otherwise, read from stdin.
let (source, len) = match std::env::args().nth(1) { let (source, len) = match std::env::args().nth(1) {
Some(source) => { Some(source) => {
let meta = std::fs::metadata(&source).unwrap(); let meta = std::fs::metadata(&source).unwrap();
@ -36,41 +33,11 @@ fn main() {
None => (None, None), None => (None, None),
}; };
// Start the copy in a separate thread
thread::spawn(move || {
// Copy to stdout - lock it for better performance.
let stdout = io::stdout();
let mut stdout = stdout.lock();
match source {
None => {
// Copy from stdin - lock it for better performance.
let stdin = io::stdin();
let stdin = stdin.lock();
let mut reader =
utils::ProgressReader::new(counter_copy, stdin);
// And copy!
io::copy(&mut reader, &mut stdout).unwrap();
}
Some(source) => {
// Copy from stdin - lock it for better performance.
let input = std::fs::File::open(source).unwrap();
let mut reader =
utils::ProgressReader::new(counter_copy, input);
// And copy!
io::copy(&mut reader, &mut stdout).unwrap();
}
}
// When we're done, shut down the application
cb_sink.send(Box::new(|s: &mut Cursive| s.quit())).unwrap();
});
// Add a single view: progress status // Add a single view: progress status
siv.add_layer( siv.add_layer(
Dialog::new().title("Copying...").content( Dialog::new()
.title("Copying...")
.content(
LinearLayout::vertical() LinearLayout::vertical()
.child( .child(
Canvas::new(counter.clone()) Canvas::new(counter.clone())
@ -87,7 +54,8 @@ fn main() {
// Print ETA if we have a file size // Print ETA if we have a file size
// Otherwise prints elapsed time. // Otherwise prints elapsed time.
if let Some(len) = len { if let Some(len) = len {
let remaining = (len as f64 - ticks) / speed; let remaining =
(len as f64 - ticks) / speed;
printer.print( printer.print(
(0, 0), (0, 0),
&format!( &format!(
@ -125,10 +93,53 @@ fn main() {
); );
} }
}), }),
), )
.button("Abort", Cursive::quit),
); );
if source.is_none() && atty::is(atty::Stream::Stdin) {
siv.add_layer(
Dialog::text(
"Please specify an input file or redirect a file to stdin.
cargo run --example vpv </dev/zero >/dev/null",
)
.button("Quit", Cursive::quit),
);
} else {
// Start the copy in a separate thread
thread::spawn(move || {
// Copy to stdout - lock it for better performance.
let stdout = io::stdout();
let mut stdout = stdout.lock();
match source {
None => {
// Copy from stdin - lock it for better performance.
let stdin = io::stdin();
let stdin = stdin.lock();
let mut reader =
utils::ProgressReader::new(counter_copy, stdin);
// And copy!
io::copy(&mut reader, &mut stdout).unwrap();
}
Some(source) => {
// Copy from stdin - lock it for better performance.
let input = std::fs::File::open(source).unwrap();
let mut reader =
utils::ProgressReader::new(counter_copy, input);
// And copy!
io::copy(&mut reader, &mut stdout).unwrap();
}
}
// When we're done, shut down the application
cb_sink.send(Box::new(|s: &mut Cursive| s.quit())).unwrap();
});
siv.set_autorefresh(true); siv.set_autorefresh(true);
}
siv.run(); siv.run();
} }