reimplement completion subcommand

This commit is contained in:
Carson McManus 2022-06-19 12:37:40 -04:00
parent 8dd10c9b29
commit 4a8f7a74d2
4 changed files with 48 additions and 31 deletions

26
Cargo.lock generated
View file

@ -183,26 +183,35 @@ dependencies = [
[[package]] [[package]]
name = "clap" name = "clap"
version = "3.1.18" version = "3.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2dbdf4bdacb33466e854ce889eee8dfd5729abf7ccd7664d0a2d60cd384440b" checksum = "d53da17d37dba964b9b3ecb5c5a1f193a2762c700e6829201e645b9381c99dc7"
dependencies = [ dependencies = [
"atty", "atty",
"bitflags", "bitflags",
"clap_derive", "clap_derive",
"clap_lex", "clap_lex",
"indexmap", "indexmap",
"lazy_static 1.4.0", "once_cell",
"strsim", "strsim",
"termcolor", "termcolor",
"textwrap", "textwrap",
] ]
[[package]] [[package]]
name = "clap_derive" name = "clap_complete"
version = "3.1.18" version = "3.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "25320346e922cffe59c0bbc5410c8d8784509efb321488971081313cb1e1a33c" checksum = "0f6ebaab5f25e4f0312dfa07cb30a755204b96e6531457c2cfdecfdf5f2adf40"
dependencies = [
"clap",
]
[[package]]
name = "clap_derive"
version = "3.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c11d40217d16aee8508cc8e5fde8b4ff24639758608e5374e731b53f85749fb9"
dependencies = [ dependencies = [
"heck", "heck",
"proc-macro-error", "proc-macro-error",
@ -213,9 +222,9 @@ dependencies = [
[[package]] [[package]]
name = "clap_lex" name = "clap_lex"
version = "0.2.0" version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a37c35f1112dad5e6e0b1adaff798507497a18fceeb30cceb3bae7d1427b9213" checksum = "5538cd660450ebeb4234cfecf8f2284b844ffc4c50531e66d584ad5b91293613"
dependencies = [ dependencies = [
"os_str_bytes", "os_str_bytes",
] ]
@ -1859,6 +1868,7 @@ dependencies = [
"base64", "base64",
"block-modes", "block-modes",
"clap", "clap",
"clap_complete",
"cookie 0.14.4", "cookie 0.14.4",
"dirs", "dirs",
"hmac-sha1", "hmac-sha1",

View file

@ -34,6 +34,7 @@ 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 = { version = "3.1.18", features = ["derive", "cargo"] } clap = { version = "3.1.18", features = ["derive", "cargo"] }
clap_complete = "3.2.1"
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,6 @@
use std::str::FromStr; use std::str::FromStr;
use clap::Parser; use clap::Parser;
use clap_complete::Shell;
#[derive(Debug, Clone, Parser)] #[derive(Debug, Clone, Parser)]
#[clap(author, version, about = "Generate Steam 2FA codes and confirm Steam trades from the command line.", long_about = None)] #[clap(author, version, about = "Generate Steam 2FA codes and confirm Steam trades from the command line.", long_about = None)]
@ -23,9 +24,7 @@ pub(crate) struct Args {
#[derive(Debug, Clone, Parser)] #[derive(Debug, Clone, Parser)]
pub(crate) enum Subcommands { pub(crate) enum Subcommands {
Debug(ArgsDebug), Debug(ArgsDebug),
// Completions { Completion(ArgsCompletions),
// TODO: Add completions
// },
Setup(ArgsSetup), Setup(ArgsSetup),
Import(ArgsImport), Import(ArgsImport),
Trade(ArgsTrade), Trade(ArgsTrade),
@ -78,6 +77,13 @@ pub(crate) struct ArgsDebug {
pub demo_conf_menu: bool pub demo_conf_menu: bool
} }
#[derive(Debug, Clone, Parser)]
#[clap(about="Generate shell completions")]
pub(crate) struct ArgsCompletions {
#[clap(arg_enum, help = "The shell to generate completions for.")]
pub shell: Shell,
}
#[derive(Debug, Clone, Parser)] #[derive(Debug, Clone, Parser)]
#[clap(about = "Set up a new account with steamguard-cli")] #[clap(about = "Set up a new account with steamguard-cli")]
pub(crate) struct ArgsSetup { pub(crate) struct ArgsSetup {

View file

@ -1,5 +1,5 @@
extern crate rpassword; extern crate rpassword;
use clap::{crate_version, App, Arg, ArgMatches, Parser, Subcommand}; use clap::{crate_version, App, Arg, ArgMatches, Parser, IntoApp};
use log::*; use log::*;
use std::{ use std::{
io::{stdout, Write}, io::{stdout, Write},
@ -11,7 +11,7 @@ use steamguard::{
SteamGuardAccount, UserLogin, SteamGuardAccount, UserLogin,
}; };
use crate::{accountmanager::ManifestAccountLoadError, cli::Subcommands}; use crate::{accountmanager::ManifestAccountLoadError};
#[macro_use] #[macro_use]
extern crate lazy_static; extern crate lazy_static;
@ -65,16 +65,15 @@ fn cli() -> App<'static> {
.help("Specify your encryption passkey.") .help("Specify your encryption passkey.")
.takes_value(true) .takes_value(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()) )
// ) )
// )
.subcommand( .subcommand(
App::new("trade") App::new("trade")
.about("Interactive interface for trade confirmations") .about("Interactive interface for trade confirmations")
@ -152,14 +151,9 @@ fn run() -> anyhow::Result<()> {
Some(cli::Subcommands::Debug(args)) => { Some(cli::Subcommands::Debug(args)) => {
return do_subcmd_debug(args); return do_subcmd_debug(args);
}, },
// Subcommand::Completions{shell} => { Some(cli::Subcommands::Completion(args)) => {
// // cli().gen_completions_to( return do_subcmd_completion(args);
// // "steamguard", },
// // Shell::from_str(completion_matches.value_of("shell").unwrap()).unwrap(),
// // &mut std::io::stdout(),
// // );
// return Ok(());
// },
_ => {}, _ => {},
}; };
@ -417,6 +411,12 @@ fn do_subcmd_debug(args: cli::ArgsDebug) -> anyhow::Result<()> {
return Ok(()); return Ok(());
} }
fn do_subcmd_completion(args: cli::ArgsCompletions) -> Result<(), anyhow::Error> {
let mut app = cli::Args::command_for_update();
clap_complete::generate(args.shell, &mut app, "steamguard", &mut std::io::stdout());
return Ok(());
}
fn do_subcmd_setup(args: cli::ArgsSetup, manifest: &mut accountmanager::Manifest) -> anyhow::Result<()> { fn do_subcmd_setup(args: cli::ArgsSetup, manifest: &mut accountmanager::Manifest) -> anyhow::Result<()> {
println!("Log in to the account that you want to link to steamguard-cli"); println!("Log in to the account that you want to link to steamguard-cli");
print!("Username: "); print!("Username: ");