diff --git a/Cargo.lock b/Cargo.lock index ec271cb..c7ec658 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -76,17 +76,28 @@ dependencies = [ [[package]] name = "clap" -version = "2.34.0" +version = "3.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +checksum = "d2dbdf4bdacb33466e854ce889eee8dfd5729abf7ccd7664d0a2d60cd384440b" dependencies = [ - "ansi_term", "atty", "bitflags", + "clap_lex", + "indexmap", + "lazy_static", "strsim", - "term_size", + "termcolor", + "terminal_size", "textwrap", - "unicode-width", +] + +[[package]] +name = "clap_lex" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a37c35f1112dad5e6e0b1adaff798507497a18fceeb30cceb3bae7d1427b9213" +dependencies = [ + "os_str_bytes", ] [[package]] @@ -136,6 +147,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -160,6 +177,16 @@ dependencies = [ "thiserror", ] +[[package]] +name = "indexmap" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" +dependencies = [ + "autocfg", + "hashbrown", +] + [[package]] name = "itertools" version = "0.10.3" @@ -202,6 +229,12 @@ dependencies = [ "autocfg", ] +[[package]] +name = "os_str_bytes" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "029d8d0b2f198229de29dca79676f2738ff952edf3fde542eb8bf94d8c21b435" + [[package]] name = "predicates" version = "2.1.1" @@ -275,9 +308,9 @@ checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64" [[package]] name = "strsim" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" @@ -291,10 +324,19 @@ dependencies = [ ] [[package]] -name = "term_size" -version = "0.3.2" +name = "termcolor" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e4129646ca0ed8f45d09b929036bafad5377103edd06e50bf574b353d2b08d9" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "terminal_size" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df" dependencies = [ "libc", "winapi", @@ -308,12 +350,11 @@ checksum = "507e9898683b6c43a9aa55b64259b721b52ba226e0f3779137e50ad114a4c90b" [[package]] name = "textwrap" -version = "0.11.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" dependencies = [ - "term_size", - "unicode-width", + "terminal_size", ] [[package]] @@ -342,12 +383,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" -[[package]] -name = "unicode-width" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" - [[package]] name = "unicode-xid" version = "0.2.3" @@ -379,6 +414,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 7c4058b..fea309c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,9 +19,9 @@ libc = "0.2" thiserror = "1.0" [dependencies.clap] -version = "2" +version = "3" default-features = false -features = ["suggestions", "color", "wrap_help"] +features = ["std", "suggestions", "color", "wrap_help", "cargo"] [dev-dependencies] assert_cmd = "2.0" diff --git a/src/bin/hexyl.rs b/src/bin/hexyl.rs index 8b8f836..6d628fa 100644 --- a/src/bin/hexyl.rs +++ b/src/bin/hexyl.rs @@ -6,7 +6,7 @@ use std::fs::File; use std::io::{self, prelude::*, SeekFrom}; use std::num::NonZeroI64; -use clap::{App, AppSettings, Arg}; +use clap::{crate_name, crate_version, AppSettings, Arg, ColorChoice, Command}; use atty::Stream; @@ -21,21 +21,19 @@ use hexyl::{BorderStyle, Input, Printer}; const DEFAULT_BLOCK_SIZE: i64 = 512; fn run() -> Result<(), AnyhowError> { - let app = App::new(crate_name!()) - .setting(AppSettings::ColorAuto) - .setting(AppSettings::ColoredHelp) + let command = Command::new(crate_name!()) .setting(AppSettings::DeriveDisplayOrder) - .setting(AppSettings::UnifiedHelpMessage) + .color(ColorChoice::Auto) .max_term_width(90) .version(crate_version!()) .about(crate_description!()) .arg( - Arg::with_name("FILE") + Arg::new("FILE") .help("The file to display. If no FILE argument is given, read from STDIN."), ) .arg( - Arg::with_name("length") - .short("n") + Arg::new("length") + .short('n') .long("length") .takes_value(true) .value_name("N") @@ -48,8 +46,8 @@ fn run() -> Result<(), AnyhowError> { ), ) .arg( - Arg::with_name("bytes") - .short("c") + Arg::new("bytes") + .short('c') .long("bytes") .takes_value(true) .value_name("N") @@ -57,17 +55,17 @@ fn run() -> Result<(), AnyhowError> { .help("An alias for -n/--length"), ) .arg( - Arg::with_name("count") - .short("l") + Arg::new("count") + .short('l') .takes_value(true) .value_name("N") .conflicts_with_all(&["length", "bytes"]) - .hidden(true) + .hide(true) .help("Yet another alias for -n/--length"), ) .arg( - Arg::with_name("skip") - .short("s") + Arg::new("skip") + .short('s') .long("skip") .takes_value(true) .value_name("N") @@ -78,7 +76,7 @@ fn run() -> Result<(), AnyhowError> { ), ) .arg( - Arg::with_name("block_size") + Arg::new("block_size") .long("block-size") .takes_value(true) .value_name("SIZE") @@ -89,8 +87,8 @@ fn run() -> Result<(), AnyhowError> { )), ) .arg( - Arg::with_name("nosqueezing") - .short("v") + Arg::new("nosqueezing") + .short('v') .long("no-squeezing") .help( "Displays all input data. Otherwise any number of groups of output \ @@ -99,28 +97,28 @@ fn run() -> Result<(), AnyhowError> { ), ) .arg( - Arg::with_name("color") + Arg::new("color") .long("color") .takes_value(true) .value_name("WHEN") .possible_values(&["always", "auto", "never"]) - .default_value_if("plain", None, "never") + .default_value_if("plain", None, Some("never")) .default_value("always") .help( "When to use colors. The auto-mode only displays colors if the output \ goes to an interactive terminal", ), ) - .arg(Arg::with_name("plain").short("p").long("plain").help( + .arg(Arg::new("plain").short('p').long("plain").help( "Display output with --no-characters, --no-position, --border=none, and --color=never.", )) .arg( - Arg::with_name("border") + Arg::new("border") .long("border") .takes_value(true) .value_name("STYLE") .possible_values(&["unicode", "ascii", "none"]) - .default_value_if("plain", None, "none") + .default_value_if("plain", None, Some("none")) .default_value("unicode") .help( "Whether to draw a border with Unicode characters, ASCII characters, \ @@ -128,20 +126,20 @@ fn run() -> Result<(), AnyhowError> { ), ) .arg( - Arg::with_name("no_chars") - .short("C") + Arg::new("no_chars") + .short('C') .long("no-characters") .help("Whether to display the character panel on the right."), ) .arg( - Arg::with_name("no_position") - .short("P") + Arg::new("no_position") + .short('P') .long("no-position") .help("Whether to display the position panel on the left."), ) .arg( - Arg::with_name("display_offset") - .short("o") + Arg::new("display_offset") + .short('o') .long("display-offset") .takes_value(true) .value_name("N") @@ -153,7 +151,7 @@ fn run() -> Result<(), AnyhowError> { ), ); - let matches = app.get_matches_safe()?; + let matches = command.get_matches(); let stdin = io::stdin(); @@ -294,24 +292,7 @@ fn main() { let result = run(); if let Err(err) = result { - if let Some(clap_err) = err.downcast_ref::() { - match clap_err.kind { - // The exit code should not indicate an error for --help / --version - clap::ErrorKind::HelpDisplayed => { - eprint!("{}", clap_err); // Clap errors already have newlines - std::process::exit(0) - } - clap::ErrorKind::VersionDisplayed => { - // Version output in clap 2.33.1 (dep as of now) doesn't have a newline - // and the fix is not included even in the latest stable release - println!(); - std::process::exit(0) - } - _ => (), - } - } else { - eprintln!("Error: {:?}", err); - } + eprintln!("Error: {:?}", err); std::process::exit(1); } }