upgrade to clap v3, convert global level arguments

This commit is contained in:
Carson McManus 2022-06-12 12:17:26 -04:00
parent a19f379314
commit abe808b7bf
3 changed files with 151 additions and 54 deletions

96
Cargo.lock generated
View file

@ -29,15 +29,6 @@ dependencies = [
"memchr", "memchr",
] ]
[[package]]
name = "ansi_term"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
dependencies = [
"winapi",
]
[[package]] [[package]]
name = "anyhow" name = "anyhow"
version = "1.0.57" version = "1.0.57"
@ -192,17 +183,41 @@ dependencies = [
[[package]] [[package]]
name = "clap" name = "clap"
version = "2.34.0" version = "3.1.18"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" checksum = "d2dbdf4bdacb33466e854ce889eee8dfd5729abf7ccd7664d0a2d60cd384440b"
dependencies = [ dependencies = [
"ansi_term",
"atty", "atty",
"bitflags", "bitflags",
"clap_derive",
"clap_lex",
"indexmap",
"lazy_static 1.4.0",
"strsim", "strsim",
"termcolor",
"textwrap", "textwrap",
"unicode-width", ]
"vec_map",
[[package]]
name = "clap_derive"
version = "3.1.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "25320346e922cffe59c0bbc5410c8d8784509efb321488971081313cb1e1a33c"
dependencies = [
"heck",
"proc-macro-error",
"proc-macro2",
"quote",
"syn",
]
[[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]] [[package]]
@ -578,6 +593,12 @@ version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
[[package]]
name = "heck"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9"
[[package]] [[package]]
name = "hermit-abi" name = "hermit-abi"
version = "0.1.19" version = "0.1.19"
@ -938,6 +959,12 @@ version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
[[package]]
name = "os_str_bytes"
version = "6.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "21326818e99cfe6ce1e524c2a805c189a99b5ae555a35d19f9a284b427d86afa"
[[package]] [[package]]
name = "parking_lot" name = "parking_lot"
version = "0.12.1" version = "0.12.1"
@ -1097,6 +1124,30 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
[[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]] [[package]]
name = "proc-macro-hack" name = "proc-macro-hack"
version = "0.5.19" version = "0.5.19"
@ -1860,9 +1911,9 @@ dependencies = [
[[package]] [[package]]
name = "strsim" name = "strsim"
version = "0.8.0" version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
[[package]] [[package]]
name = "subtle" name = "subtle"
@ -1957,12 +2008,9 @@ checksum = "442f2674e6bd8489052b958e0eaebd89c26eefa3be9dc359d1e2ecccdc510f45"
[[package]] [[package]]
name = "textwrap" name = "textwrap"
version = "0.11.0" version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb"
dependencies = [
"unicode-width",
]
[[package]] [[package]]
name = "thin-slice" name = "thin-slice"
@ -2232,12 +2280,6 @@ dependencies = [
"getrandom 0.2.6", "getrandom 0.2.6",
] ]
[[package]]
name = "vec_map"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
[[package]] [[package]]
name = "version_check" name = "version_check"
version = "0.9.4" version = "0.9.4"

View file

@ -7,7 +7,7 @@ members = [
[package] [package]
name = "steamguard-cli" name = "steamguard-cli"
version = "0.4.5" version = "0.4.5"
authors = ["Carson McManus <carson.mcmanus1@gmail.com>"] authors = ["dyc3 (Carson McManus) <carson.mcmanus1@gmail.com>"]
edition = "2018" edition = "2018"
description = "A command line utility to generate Steam 2FA codes and respond to confirmations." description = "A command line utility to generate Steam 2FA codes and respond to confirmations."
keywords = ["steam", "2fa", "steamguard", "authentication", "cli"] keywords = ["steam", "2fa", "steamguard", "authentication", "cli"]
@ -33,7 +33,7 @@ serde_json = "1.0"
rsa = "0.5.0" rsa = "0.5.0"
rand = "0.8.4" rand = "0.8.4"
standback = "0.2.17" # required to fix a compilation error on a transient dependency standback = "0.2.17" # required to fix a compilation error on a transient dependency
clap = "2.33.3" clap = { version = "3.1.18", features = ["derive", "cargo"] }
log = "0.4.14" log = "0.4.14"
stderrlog = "0.4" stderrlog = "0.4"
cookie = "0.14" cookie = "0.14"

View file

@ -1,5 +1,5 @@
extern crate rpassword; extern crate rpassword;
use clap::{crate_version, App, Arg, ArgMatches, Shell}; use clap::{crate_version, App, Arg, ArgMatches, Parser};
use log::*; use log::*;
use std::str::FromStr; use std::str::FromStr;
use std::{ use std::{
@ -29,7 +29,59 @@ mod encryption;
mod errors; mod errors;
mod tui; mod tui;
fn cli() -> App<'static, 'static> { #[derive(Debug, Clone, Parser)]
#[clap(author, version, about, long_about = None)]
struct Args {
#[clap(short, long, help = "Steam username, case-sensitive.", long_help = "Select the account you want by steam username. Case-sensitive. By default, the first account in the manifest is selected.")]
username: Option<String>,
#[clap(short, long, help = "Select all accounts in the manifest.")]
all: bool,
/// The path to the maFiles directory.
#[clap(short, long, default_value = "~/.config/steamguard-cli/maFiles", help = "Specify which folder your maFiles are in. This should be a path to a folder that contains manifest.json.")]
mafiles_path: String,
#[clap(short, long, help = "Specify your encryption passkey.")]
passkey: Option<String>,
#[clap(short, long, default_value_t=Verbosity::Info, help = "Set the log level.")]
verbosity: Verbosity,
}
#[derive(Debug, Clone, Copy)]
enum Verbosity {
Error = 0,
Warn = 1,
Info = 2,
Debug = 3,
Trace = 4,
}
impl std::fmt::Display for Verbosity {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_fmt(format_args!("{}", match self {
Verbosity::Error => "error",
Verbosity::Warn => "warn",
Verbosity::Info => "info",
Verbosity::Debug => "debug",
Verbosity::Trace => "trace",
}))
}
}
impl FromStr for Verbosity {
type Err = anyhow::Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"error" => Ok(Verbosity::Error),
"warn" => Ok(Verbosity::Warn),
"info" => Ok(Verbosity::Info),
"debug" => Ok(Verbosity::Debug),
"trace" => Ok(Verbosity::Trace),
_ => Err(anyhow!("Invalid verbosity level: {}", s)),
}
}
}
fn cli() -> App<'static> {
App::new("steamguard-cli") App::new("steamguard-cli")
.version(crate_version!()) .version(crate_version!())
.bin_name("steamguard") .bin_name("steamguard")
@ -38,7 +90,7 @@ fn cli() -> App<'static, 'static> {
.arg( .arg(
Arg::with_name("username") Arg::with_name("username")
.long("username") .long("username")
.short("u") .short('u')
.takes_value(true) .takes_value(true)
.help("Select the account you want by steam username. Case-sensitive. By default, the first account in the manifest is selected.") .help("Select the account you want by steam username. Case-sensitive. By default, the first account in the manifest is selected.")
.conflicts_with("all") .conflicts_with("all")
@ -46,7 +98,7 @@ fn cli() -> App<'static, 'static> {
.arg( .arg(
Arg::with_name("all") Arg::with_name("all")
.long("all") .long("all")
.short("a") .short('a')
.takes_value(false) .takes_value(false)
.help("Select all accounts in the manifest.") .help("Select all accounts in the manifest.")
.conflicts_with("username") .conflicts_with("username")
@ -54,40 +106,40 @@ fn cli() -> App<'static, 'static> {
.arg( .arg(
Arg::with_name("mafiles-path") Arg::with_name("mafiles-path")
.long("mafiles-path") .long("mafiles-path")
.short("m") .short('m')
.default_value("~/maFiles") .default_value("~/maFiles")
.help("Specify which folder your maFiles are in. This should be a path to a folder that contains manifest.json.") .help("Specify which folder your maFiles are in. This should be a path to a folder that contains manifest.json.")
) )
.arg( .arg(
Arg::with_name("passkey") Arg::with_name("passkey")
.long("passkey") .long("passkey")
.short("p") .short('p')
.help("Specify your encryption passkey.") .help("Specify your encryption passkey.")
.takes_value(true) .takes_value(true)
) )
.arg( .arg(
Arg::with_name("verbosity") Arg::with_name("verbosity")
.short("v") .short('v')
.help("Log what is going on verbosely.") .help("Log what is going on verbosely.")
.takes_value(false) .takes_value(false)
.multiple(true) .multiple(true)
) )
.subcommand( // .subcommand(
App::new("completion") // App::new("completion")
.about("Generate shell completions") // .about("Generate shell completions")
.arg( // .arg(
Arg::with_name("shell") // Arg::with_name("shell")
.long("shell") // .long("shell")
.takes_value(true) // .takes_value(true)
.possible_values(&Shell::variants()) // .possible_values(&Shell::variants())
) // )
) // )
.subcommand( .subcommand(
App::new("trade") App::new("trade")
.about("Interactive interface for trade confirmations") .about("Interactive interface for trade confirmations")
.arg( .arg(
Arg::with_name("accept-all") Arg::with_name("accept-all")
.short("a") .short('a')
.long("accept-all") .long("accept-all")
.takes_value(false) .takes_value(false)
.help("Accept all open trade confirmations. Does not open interactive interface.") .help("Accept all open trade confirmations. Does not open interactive interface.")
@ -144,11 +196,14 @@ fn main() {
} }
fn run() -> anyhow::Result<()> { fn run() -> anyhow::Result<()> {
let new_args = Args::parse();
println!("{:?}", new_args);
return Ok(());
let matches = cli().get_matches(); let matches = cli().get_matches();
let verbosity = matches.occurrences_of("verbosity") as usize + 2;
stderrlog::new() stderrlog::new()
.verbosity(verbosity) .verbosity(new_args.verbosity as usize)
.module(module_path!()) .module(module_path!())
.module("steamguard") .module("steamguard")
.init() .init()
@ -161,11 +216,11 @@ fn run() -> anyhow::Result<()> {
return Ok(()); return Ok(());
} }
if let Some(completion_matches) = matches.subcommand_matches("completion") { if let Some(completion_matches) = matches.subcommand_matches("completion") {
cli().gen_completions_to( // cli().gen_completions_to(
"steamguard", // "steamguard",
Shell::from_str(completion_matches.value_of("shell").unwrap()).unwrap(), // Shell::from_str(completion_matches.value_of("shell").unwrap()).unwrap(),
&mut std::io::stdout(), // &mut std::io::stdout(),
); // );
return Ok(()); return Ok(());
} }