diff options
author | Daniel Mueller <deso@posteo.net> | 2020-04-11 13:23:52 -0700 |
---|---|---|
committer | Daniel Mueller <deso@posteo.net> | 2020-04-11 13:23:52 -0700 |
commit | fafbf4a1bf635d5eea049cf561fbf8aa293c8e2b (patch) | |
tree | d018a9e74d044e9161f436f2a5fd977022cf9599 /src/args.rs | |
parent | 93c605418568bf71bcc3be6956f07f9650b45fea (diff) | |
download | nitrocli-fafbf4a1bf635d5eea049cf561fbf8aa293c8e2b.tar.gz nitrocli-fafbf4a1bf635d5eea049cf561fbf8aa293c8e2b.tar.bz2 |
Merge remaining bits of args.rs into main.rs
This change removes the args module by moving all remaining
functionality in it into main.rs. The result is arguably a nice
consolidation of all context related definitions in a single module.
Diffstat (limited to 'src/args.rs')
-rw-r--r-- | src/args.rs | 99 |
1 files changed, 0 insertions, 99 deletions
diff --git a/src/args.rs b/src/args.rs deleted file mode 100644 index d0b2a88..0000000 --- a/src/args.rs +++ /dev/null @@ -1,99 +0,0 @@ -// args.rs - -// ************************************************************************* -// * Copyright (C) 2018-2020 Daniel Mueller (deso@posteo.net) * -// * * -// * This program is free software: you can redistribute it and/or modify * -// * it under the terms of the GNU General Public License as published by * -// * the Free Software Foundation, either version 3 of the License, or * -// * (at your option) any later version. * -// * * -// * This program is distributed in the hope that it will be useful, * -// * but WITHOUT ANY WARRANTY; without even the implied warranty of * -// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * -// * GNU General Public License for more details. * -// * * -// * You should have received a copy of the GNU General Public License * -// * along with this program. If not, see <http://www.gnu.org/licenses/>. * -// ************************************************************************* - -use std::ffi; -use std::io; -use std::result; - -use crate::arg_defs; -use crate::error::Error; -use crate::RunCtx; - -type Result<T> = result::Result<T, Error>; - -trait Stdio { - fn stdio(&mut self) -> (&mut dyn io::Write, &mut dyn io::Write); -} - -impl<'io> Stdio for RunCtx<'io> { - fn stdio(&mut self) -> (&mut dyn io::Write, &mut dyn io::Write) { - (self.stdout, self.stderr) - } -} - -impl<W> Stdio for (&mut W, &mut W) -where - W: io::Write, -{ - fn stdio(&mut self) -> (&mut dyn io::Write, &mut dyn io::Write) { - (self.0, self.1) - } -} - -/// A command execution context that captures additional data pertaining -/// the command execution. -pub struct ExecCtx<'io> { - pub model: Option<arg_defs::DeviceModel>, - pub stdout: &'io mut dyn io::Write, - pub stderr: &'io mut dyn io::Write, - pub admin_pin: Option<ffi::OsString>, - pub user_pin: Option<ffi::OsString>, - pub new_admin_pin: Option<ffi::OsString>, - pub new_user_pin: Option<ffi::OsString>, - pub password: Option<ffi::OsString>, - pub no_cache: bool, - pub verbosity: u64, -} - -impl<'io> Stdio for ExecCtx<'io> { - fn stdio(&mut self) -> (&mut dyn io::Write, &mut dyn io::Write) { - (self.stdout, self.stderr) - } -} - -/// Parse the command-line arguments and execute the selected command. -pub(crate) fn handle_arguments(ctx: &mut RunCtx<'_>, args: Vec<String>) -> Result<()> { - use structopt::StructOpt; - - match arg_defs::Args::from_iter_safe(args.iter()) { - Ok(args) => { - let mut ctx = ExecCtx { - model: args.model, - stdout: ctx.stdout, - stderr: ctx.stderr, - admin_pin: ctx.admin_pin.take(), - user_pin: ctx.user_pin.take(), - new_admin_pin: ctx.new_admin_pin.take(), - new_user_pin: ctx.new_user_pin.take(), - password: ctx.password.take(), - no_cache: ctx.no_cache, - verbosity: args.verbose.into(), - }; - args.cmd.execute(&mut ctx) - } - Err(err) => { - if err.use_stderr() { - Err(err.into()) - } else { - println!(ctx, "{}", err.message)?; - Ok(()) - } - } - } -} |