From 41f352bff4d7cb221d009b1bfc7f0664bea9b348 Mon Sep 17 00:00:00 2001 From: Daniel Mueller Date: Fri, 8 Feb 2019 18:13:28 -0800 Subject: Consume ArgumentParser object as part of parsing We have introduced the parse function to unify the common parsing related tasks. In that vein, this change goes one step further and adjusts the function to actually consume the ArgumentParser object used by it. All clients using this function actually do not access the parser afterwards, and, in fact, some of them have to explicitly drop it because of borrow conflicts with "referred" arguments. --- nitrocli/src/args.rs | 84 +++++++++++++++++++++------------------------------- 1 file changed, 34 insertions(+), 50 deletions(-) diff --git a/nitrocli/src/args.rs b/nitrocli/src/args.rs index 3331779..a0ad583 100644 --- a/nitrocli/src/args.rs +++ b/nitrocli/src/args.rs @@ -173,20 +173,22 @@ Enum! {PwsCommand, [ fn parse( ctx: &mut impl Stdio, - parser: &argparse::ArgumentParser<'_>, + parser: argparse::ArgumentParser<'_>, args: Vec, ) -> Result<()> { let (stdout, stderr) = ctx.stdio(); - parser + let result = parser .parse(args, stdout, stderr) - .map_err(Error::ArgparseError) + .map_err(Error::ArgparseError); + drop(parser); + result } /// Inquire the status of the nitrokey. fn status(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { let mut parser = argparse::ArgumentParser::new(); parser.set_description("Prints the status of the connected Nitrokey device"); - parse(ctx, &parser, args)?; + parse(ctx, parser, args)?; commands::status(ctx) } @@ -195,7 +197,7 @@ fn status(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { fn reset(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { let mut parser = argparse::ArgumentParser::new(); parser.set_description("Performs a factory reset"); - parse(ctx, &parser, args)?; + parse(ctx, parser, args)?; commands::reset(ctx) } @@ -225,8 +227,7 @@ fn storage(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { "The arguments for the subcommand", ); parser.stop_on_first_argument(true); - parse(ctx, &parser, args)?; - drop(parser); + parse(ctx, parser, args)?; subargs.insert(0, format!("nitrocli {} {}", Command::Storage, subcommand)); subcommand.execute(ctx, subargs) @@ -236,7 +237,7 @@ fn storage(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { fn storage_open(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { let mut parser = argparse::ArgumentParser::new(); parser.set_description("Opens the encrypted volume on a Nitrokey Storage"); - parse(ctx, &parser, args)?; + parse(ctx, parser, args)?; commands::storage_open(ctx) } @@ -245,7 +246,7 @@ fn storage_open(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { fn storage_close(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { let mut parser = argparse::ArgumentParser::new(); parser.set_description("Closes the encrypted volume on a Nitrokey Storage"); - parse(ctx, &parser, args)?; + parse(ctx, parser, args)?; commands::storage_close(ctx) } @@ -254,7 +255,7 @@ fn storage_close(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { fn storage_status(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { let mut parser = argparse::ArgumentParser::new(); parser.set_description("Prints the status of the Nitrokey's storage"); - parse(ctx, &parser, args)?; + parse(ctx, parser, args)?; commands::storage_status(ctx) } @@ -283,8 +284,7 @@ fn storage_hidden(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { "The arguments for the subcommand", ); parser.stop_on_first_argument(true); - parse(ctx, &parser, args)?; - drop(parser); + parse(ctx, parser, args)?; subargs.insert( 0, @@ -321,8 +321,7 @@ fn storage_hidden_create(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> "The end location of the hidden volume as percentage of the \ encrypted volume's size (1-100)", ); - parse(ctx, &parser, args)?; - drop(parser); + parse(ctx, parser, args)?; commands::storage_hidden_create(ctx, slot, start, end) } @@ -330,7 +329,7 @@ fn storage_hidden_create(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> fn storage_hidden_open(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { let mut parser = argparse::ArgumentParser::new(); parser.set_description("Opens a hidden volume on a Nitrokey Storage"); - parse(ctx, &parser, args)?; + parse(ctx, parser, args)?; commands::storage_hidden_open(ctx) } @@ -338,7 +337,7 @@ fn storage_hidden_open(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { fn storage_hidden_close(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { let mut parser = argparse::ArgumentParser::new(); parser.set_description("Closes the hidden volume on a Nitrokey Storage"); - parse(ctx, &parser, args)?; + parse(ctx, parser, args)?; commands::storage_hidden_close(ctx) } @@ -361,8 +360,7 @@ fn config(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { "The arguments for the subcommand", ); parser.stop_on_first_argument(true); - parse(ctx, &parser, args)?; - drop(parser); + parse(ctx, parser, args)?; subargs.insert(0, format!("nitrocli {} {}", Command::Config, subcommand)); subcommand.execute(ctx, subargs) @@ -372,7 +370,7 @@ fn config(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { fn config_get(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { let mut parser = argparse::ArgumentParser::new(); parser.set_description("Prints the Nitrokey configuration"); - parse(ctx, &parser, args)?; + parse(ctx, parser, args)?; commands::config_get(ctx) } @@ -429,8 +427,7 @@ fn config_set(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { argparse::StoreTrue, "Allow one-time password generation without PIN", ); - parse(ctx, &parser, args)?; - drop(parser); + parse(ctx, parser, args)?; let numlock = ConfigOption::try_from(no_numlock, numlock, "numlock")?; let capslock = ConfigOption::try_from(no_capslock, capslock, "capslock")?; @@ -449,7 +446,7 @@ fn config_set(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { fn lock(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { let mut parser = argparse::ArgumentParser::new(); parser.set_description("Locks the connected Nitrokey device"); - parse(ctx, &parser, args)?; + parse(ctx, parser, args)?; commands::lock(ctx) } @@ -472,8 +469,7 @@ fn otp(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { "The arguments for the subcommand", ); parser.stop_on_first_argument(true); - parse(ctx, &parser, args)?; - drop(parser); + parse(ctx, parser, args)?; subargs.insert(0, format!("nitrocli {} {}", Command::Otp, subcommand)); subcommand.execute(ctx, subargs) @@ -504,8 +500,7 @@ fn otp_get(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { argparse::StoreOption, "The time to use for TOTP generation (Unix timestamp, default: system time)", ); - parse(ctx, &parser, args)?; - drop(parser); + parse(ctx, parser, args)?; commands::otp_get(ctx, slot, algorithm, time) } @@ -576,8 +571,7 @@ pub fn otp_set(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { argparse::StoreOption, &fmt_help, ); - parse(ctx, &parser, args)?; - drop(parser); + parse(ctx, parser, args)?; if ascii { if secret_format.is_some() { @@ -624,8 +618,7 @@ fn otp_clear(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { let _ = parser .refer(&mut algorithm) .add_option(&["-a", "--algorithm"], argparse::Store, &help); - parse(ctx, &parser, args)?; - drop(parser); + parse(ctx, parser, args)?; commands::otp_clear(ctx, slot, algorithm) } @@ -640,8 +633,7 @@ fn otp_status(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { argparse::StoreTrue, "Show slots that are not programmed", ); - parse(ctx, &parser, args)?; - drop(parser); + parse(ctx, parser, args)?; commands::otp_status(ctx, all) } @@ -664,8 +656,7 @@ fn pin(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { "The arguments for the subcommand", ); parser.stop_on_first_argument(true); - parse(ctx, &parser, args)?; - drop(parser); + parse(ctx, parser, args)?; subargs.insert(0, format!("nitrocli {} {}", Command::Pin, subcommand)); subcommand.execute(ctx, subargs) @@ -675,7 +666,7 @@ fn pin(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { fn pin_clear(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { let mut parser = argparse::ArgumentParser::new(); parser.set_description("Clears the cached PINs"); - parse(ctx, &parser, args)?; + parse(ctx, parser, args)?; commands::pin_clear(ctx) } @@ -690,8 +681,7 @@ fn pin_set(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { .refer(&mut pintype) .required() .add_argument("type", argparse::Store, &help); - parse(ctx, &parser, args)?; - drop(parser); + parse(ctx, parser, args)?; commands::pin_set(ctx, pintype) } @@ -700,7 +690,7 @@ fn pin_set(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { fn pin_unblock(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { let mut parser = argparse::ArgumentParser::new(); parser.set_description("Unblocks and resets the user PIN"); - parse(ctx, &parser, args)?; + parse(ctx, parser, args)?; commands::pin_unblock(ctx) } @@ -723,8 +713,7 @@ fn pws(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { "The arguments for the subcommand", ); parser.stop_on_first_argument(true); - parse(ctx, &parser, args)?; - drop(parser); + parse(ctx, parser, args)?; subargs.insert(0, format!("nitrocli {} {}", Command::Pws, subcommand)); subcommand.execute(ctx, subargs) @@ -764,8 +753,7 @@ fn pws_get(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { argparse::StoreTrue, "Print the stored data without description", ); - parse(ctx, &parser, args)?; - drop(parser); + parse(ctx, parser, args)?; commands::pws_get(ctx, slot, name, login, password, quiet) } @@ -798,8 +786,7 @@ fn pws_set(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { argparse::Store, "The password to store on the slot", ); - parse(ctx, &parser, args)?; - drop(parser); + parse(ctx, parser, args)?; commands::pws_set(ctx, slot, &name, &login, &password) } @@ -814,8 +801,7 @@ fn pws_clear(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { argparse::Store, "The PWS slot to clear", ); - parse(ctx, &parser, args)?; - drop(parser); + parse(ctx, parser, args)?; commands::pws_clear(ctx, slot) } @@ -830,8 +816,7 @@ fn pws_status(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { argparse::StoreTrue, "Show slots that are not programmed", ); - parse(ctx, &parser, args)?; - drop(parser); + parse(ctx, parser, args)?; commands::pws_status(ctx, all) } @@ -877,8 +862,7 @@ fn parse_arguments<'io, 'ctx: 'io>( "The arguments for the command", ); parser.stop_on_first_argument(true); - parse(ctx, &parser, args)?; - drop(parser); + parse(ctx, parser, args)?; subargs.insert(0, format!("nitrocli {}", command)); -- cgit v1.2.1