From 9310fa6834e50151d781086aecd77d085ec0feaf Mon Sep 17 00:00:00 2001 From: Avril Date: Tue, 22 Sep 2020 22:44:07 +0100 Subject: [PATCH] parse: stat okay --- src/args/mod.rs | 2 +- src/args/parse/mod.rs | 3 ++- src/args/parse/stat.rs | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 src/args/parse/stat.rs diff --git a/src/args/mod.rs b/src/args/mod.rs index 0f7aca7..88baf0e 100644 --- a/src/args/mod.rs +++ b/src/args/mod.rs @@ -23,7 +23,7 @@ pub fn usage() -> ! Usage: {program} [OPTIONS...] [-e|-d|-a] [-] [] Usage: {program} --generate RSA [--input ] [--input-password[=]] [--password[=]] [--format BIN|TEXT|PEM] [] Usage: {program} --generate AES [--input ] [--input-password[=]] [--password[=]] [--format BIN|TEXT] -Usage: {program} --stat +Usage: {program} --stat [-P=] [-] [-p] Usage: {program} --help - Stop reading argument flags: diff --git a/src/args/parse/mod.rs b/src/args/parse/mod.rs index ba640ed..afb36b2 100644 --- a/src/args/parse/mod.rs +++ b/src/args/parse/mod.rs @@ -15,6 +15,7 @@ use error::ParseErrorKind; mod normal; mod generate; +mod stat; #[derive(Debug, Hash, PartialEq, Eq)] enum IsSigning @@ -166,7 +167,7 @@ pub async fn parse + std::fmt::Debug>(args: I) -> R handler }, "--help" => return Ok(config::Operation::Help), - "--stat" => todo!(), + "--stat" => return Ok(config::Operation::KeyInfo(stat::parse_stat(args)?)), _ => { let handler = tokio::spawn(normal::handle(rx)); match normal::parse(std::iter::once(arg) diff --git a/src/args/parse/stat.rs b/src/args/parse/stat.rs new file mode 100644 index 0000000..74980b5 --- /dev/null +++ b/src/args/parse/stat.rs @@ -0,0 +1,38 @@ +//! Stat mode +use super::*; + +pub fn parse_stat>(args: I) -> Result, error::Error> +{ + let mut args = args.into_iter(); + let mut output = Vec::new(); + let mut reading=true; + while let Some(arg) = args.next() + { + macro_rules! take_one { + ($msg:literal $($tt:tt)*) => { + match args.next() { + Some(v) => v, + None => return Err((arg, ParseErrorKind::ExpectedArg(format!($msg $($tt)*))).into()), + } + } + } + if reading && arg.starts_with("-") { + match arg.trim() { + "-" => reading=false, + "-P" => { + let password = take_one!("-P: expected password string"); + let key = take_one!("-P: expected key file"); + output.push((key, Password::Specific(password))); + }, + other if other.starts_with("-p") => { + output.push(((&other[2..]).to_owned(), Password::Yes)); + }, + _ => return Err((arg, ParseErrorKind::UnexpectedArg(None)).into()), + } + } else { + output.push((arg, Password::No)); + } + } + + Ok(output) +}