diff options
-rw-r--r-- | src/arg_util.rs | 115 | ||||
-rw-r--r-- | src/args.rs | 90 | ||||
-rw-r--r-- | src/main.rs | 1 |
3 files changed, 29 insertions, 177 deletions
diff --git a/src/arg_util.rs b/src/arg_util.rs index dbb9ce1..52d1020 100644 --- a/src/arg_util.rs +++ b/src/arg_util.rs @@ -33,35 +33,6 @@ macro_rules! Command { )* } - impl ::std::convert::AsRef<str> for $name { - fn as_ref(&self) -> &'static str { - match *self { - $( - $name::$var(_) => $str, - )* - } - } - } - - impl ::std::fmt::Display for $name { - fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write!(f, "{}", self.as_ref()) - } - } - - impl ::std::str::FromStr for $name { - type Err = &'static str; - - fn from_str(s: &str) -> ::std::result::Result<Self, Self::Err> { - match s { - $( - $str => Ok($name::$var(::std::default::Default::default())), - )* - _ => Err("[error]"), - } - } - } - #[allow(unused_qualifications)] impl $name { fn execute( @@ -75,62 +46,6 @@ macro_rules! Command { } } } - - impl_default!($name => $( $name::$var(::std::default::Default::default()) , )*); - }; - ( $name:ident, [ $( $var:ident => ($str:expr, $exec:expr), ) *] ) => { - #[derive(Debug, PartialEq, ::structopt::StructOpt)] - pub enum $name { - $( - $var, - )* - } - - impl ::std::convert::AsRef<str> for $name { - fn as_ref(&self) -> &'static str { - match *self { - $( - $name::$var => $str, - )* - } - } - } - - impl ::std::fmt::Display for $name { - fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write!(f, "{}", self.as_ref()) - } - } - - impl ::std::str::FromStr for $name { - type Err = &'static str; - - fn from_str(s: &str) -> ::std::result::Result<Self, Self::Err> { - match s { - $( - $str => Ok($name::$var), - )* - _ => Err("[error]"), - } - } - } - - #[allow(unused_qualifications)] - impl $name { - fn execute( - self, - ctx: &mut crate::args::ExecCtx<'_>, - args: ::std::vec::Vec<::std::string::String>, - ) -> crate::Result<()> { - match self { - $( - $name::$var => $exec(ctx, args), - )* - } - } - } - - impl_default!($name => $( $name::$var , )*); }; } @@ -207,39 +122,9 @@ macro_rules! enum_int { } } } - - impl_default!($name => $( $name::$var , )*); - - }; -} - -macro_rules! impl_default { - ( $name:ident => $def:expr , $( $other:expr , ) *) => { - impl ::std::default::Default for $name { - fn default() -> Self { - $def - } - } }; } -/// A macro for formatting the variants of an enum (as created by the -/// Enum!{} macro) ready to be used in a help text. The supplied `fmt` -/// needs to contain the named parameter `{variants}`, which will be -/// replaced with a generated version of the enum's variants. -macro_rules! fmt_enum { - ( $enm:ident ) => {{ - fmt_enum!($enm.all()) - }}; - ( $all:expr ) => {{ - $all - .iter() - .map(::std::convert::AsRef::as_ref) - .collect::<::std::vec::Vec<_>>() - .join("|") - }}; -} - #[cfg(test)] mod tests { Enum! {Command, [ diff --git a/src/args.rs b/src/args.rs index b31ed8e..82140f3 100644 --- a/src/args.rs +++ b/src/args.rs @@ -29,38 +29,6 @@ use crate::RunCtx; type Result<T> = result::Result<T, Error>; -/// Wraps a writer and buffers its output. -/// -/// This implementation is similar to `io::BufWriter`, but: -/// - The inner writer is only written to if `flush` is called. -/// - The buffer may grow infinitely large. -struct BufWriter<'w, W: io::Write + ?Sized> { - buf: Vec<u8>, - inner: &'w mut W, -} - -impl<'w, W: io::Write + ?Sized> BufWriter<'w, W> { - pub fn new(inner: &'w mut W) -> Self { - BufWriter { - buf: Vec::with_capacity(128), - inner, - } - } -} - -impl<'w, W: io::Write + ?Sized> io::Write for BufWriter<'w, W> { - fn write(&mut self, buf: &[u8]) -> io::Result<usize> { - self.buf.extend_from_slice(buf); - Ok(buf.len()) - } - - fn flush(&mut self) -> io::Result<()> { - self.inner.write_all(&self.buf)?; - self.buf.clear(); - self.inner.flush() - } -} - trait Stdio { fn stdio(&mut self) -> (&mut dyn io::Write, &mut dyn io::Write); } @@ -156,18 +124,18 @@ Command! {Command, [ ]} /// Reads or writes the device configuration -#[derive(Debug, Default, PartialEq, structopt::StructOpt)] +#[derive(Debug, PartialEq, structopt::StructOpt)] pub struct ConfigArgs { #[structopt(subcommand)] subcmd: ConfigCommand, } /// Prints the Nitrokey configuration -#[derive(Debug, Default, PartialEq, structopt::StructOpt)] +#[derive(Debug, PartialEq, structopt::StructOpt)] pub struct ConfigGetArgs {} /// Changes the Nitrokey configuration -#[derive(Debug, Default, PartialEq, structopt::StructOpt)] +#[derive(Debug, PartialEq, structopt::StructOpt)] pub struct ConfigSetArgs { /// Sets the numlock option to the given HOTP slot #[structopt(short = "n", long)] @@ -196,33 +164,33 @@ pub struct ConfigSetArgs { } /// Interacts with the device's encrypted volume -#[derive(Debug, Default, PartialEq, structopt::StructOpt)] +#[derive(Debug, PartialEq, structopt::StructOpt)] pub struct EncryptedArgs { #[structopt(subcommand)] subcmd: EncryptedCommand, } /// Closes the encrypted volume on a Nitrokey Storage -#[derive(Debug, Default, PartialEq, structopt::StructOpt)] +#[derive(Debug, PartialEq, structopt::StructOpt)] pub struct EncryptedCloseArgs {} /// Opens the encrypted volume on a Nitrokey Storage -#[derive(Debug, Default, PartialEq, structopt::StructOpt)] +#[derive(Debug, PartialEq, structopt::StructOpt)] pub struct EncryptedOpenArgs {} /// Interacts with the device's hidden volume -#[derive(Debug, Default, PartialEq, structopt::StructOpt)] +#[derive(Debug, PartialEq, structopt::StructOpt)] pub struct HiddenArgs { #[structopt(subcommand)] subcmd: HiddenCommand, } /// Closes the hidden volume on a Nitrokey Storage -#[derive(Debug, Default, PartialEq, structopt::StructOpt)] +#[derive(Debug, PartialEq, structopt::StructOpt)] pub struct HiddenCloseArgs {} /// Creates a hidden volume on a Nitrokey Storage -#[derive(Debug, Default, PartialEq, structopt::StructOpt)] +#[derive(Debug, PartialEq, structopt::StructOpt)] pub struct HiddenCreateArgs { /// The hidden volume slot to use slot: u8, @@ -233,22 +201,22 @@ pub struct HiddenCreateArgs { } /// Opens the hidden volume on a Nitrokey Storage -#[derive(Debug, Default, PartialEq, structopt::StructOpt)] +#[derive(Debug, PartialEq, structopt::StructOpt)] pub struct HiddenOpenArgs {} /// Locks the connected Nitrokey device -#[derive(Debug, Default, PartialEq, structopt::StructOpt)] +#[derive(Debug, PartialEq, structopt::StructOpt)] pub struct LockArgs {} /// Accesses one-time passwords -#[derive(Debug, Default, PartialEq, structopt::StructOpt)] +#[derive(Debug, PartialEq, structopt::StructOpt)] pub struct OtpArgs { #[structopt(subcommand)] subcmd: OtpCommand, } /// Clears a one-time password slot -#[derive(Debug, Default, PartialEq, structopt::StructOpt)] +#[derive(Debug, PartialEq, structopt::StructOpt)] pub struct OtpClearArgs { /// The OTP algorithm to use #[structopt(short, long, default_value = "totp")] @@ -258,7 +226,7 @@ pub struct OtpClearArgs { } /// Generates a one-time password -#[derive(Debug, Default, PartialEq, structopt::StructOpt)] +#[derive(Debug, PartialEq, structopt::StructOpt)] pub struct OtpGetArgs { /// The OTP algorithm to use #[structopt(short, long, default_value = "totp")] @@ -271,7 +239,7 @@ pub struct OtpGetArgs { } /// Configures a one-time password slot -#[derive(Debug, Default, PartialEq, structopt::StructOpt)] +#[derive(Debug, PartialEq, structopt::StructOpt)] pub struct OtpSetArgs { /// The OTP algorithm to use #[structopt(short, long, default_value = "totp")] @@ -298,7 +266,7 @@ pub struct OtpSetArgs { } /// Prints the status of the one-time password slots -#[derive(Debug, Default, PartialEq, structopt::StructOpt)] +#[derive(Debug, PartialEq, structopt::StructOpt)] pub struct OtpStatusArgs { /// Shows slots that are not programmed #[structopt(short, long)] @@ -306,18 +274,18 @@ pub struct OtpStatusArgs { } /// Manages the Nitrokey PINs -#[derive(Debug, Default, PartialEq, structopt::StructOpt)] +#[derive(Debug, PartialEq, structopt::StructOpt)] pub struct PinArgs { #[structopt(subcommand)] subcmd: PinCommand, } /// Clears the cached PINs -#[derive(Debug, Default, PartialEq, structopt::StructOpt)] +#[derive(Debug, PartialEq, structopt::StructOpt)] pub struct PinClearArgs {} /// Changes a PIN -#[derive(Debug, Default, PartialEq, structopt::StructOpt)] +#[derive(Debug, PartialEq, structopt::StructOpt)] pub struct PinSetArgs { /// The PIN type to change #[structopt(name = "type")] @@ -325,25 +293,25 @@ pub struct PinSetArgs { } /// Unblocks and resets the user PIN -#[derive(Debug, Default, PartialEq, structopt::StructOpt)] +#[derive(Debug, PartialEq, structopt::StructOpt)] pub struct PinUnblockArgs {} /// Accesses the password safe -#[derive(Debug, Default, PartialEq, structopt::StructOpt)] +#[derive(Debug, PartialEq, structopt::StructOpt)] pub struct PwsArgs { #[structopt(subcommand)] subcmd: PwsCommand, } /// Clears a password safe slot -#[derive(Debug, Default, PartialEq, structopt::StructOpt)] +#[derive(Debug, PartialEq, structopt::StructOpt)] pub struct PwsClearArgs { /// The PWS slot to clear slot: u8, } /// Reads a password safe slot -#[derive(Debug, Default, PartialEq, structopt::StructOpt)] +#[derive(Debug, PartialEq, structopt::StructOpt)] pub struct PwsGetArgs { /// Shows the name stored on the slot #[structopt(short, long)] @@ -362,7 +330,7 @@ pub struct PwsGetArgs { } /// Writes a password safe slot -#[derive(Debug, Default, PartialEq, structopt::StructOpt)] +#[derive(Debug, PartialEq, structopt::StructOpt)] pub struct PwsSetArgs { /// The PWS slot to write slot: u8, @@ -375,7 +343,7 @@ pub struct PwsSetArgs { } /// Prints the status of the password safe slots -#[derive(Debug, Default, PartialEq, structopt::StructOpt)] +#[derive(Debug, PartialEq, structopt::StructOpt)] pub struct PwsStatusArgs { /// Shows slots that are not programmed #[structopt(short, long)] @@ -383,22 +351,22 @@ pub struct PwsStatusArgs { } /// Performs a factory reset -#[derive(Debug, Default, PartialEq, structopt::StructOpt)] +#[derive(Debug, PartialEq, structopt::StructOpt)] pub struct ResetArgs {} /// Prints the status of the connected Nitrokey device -#[derive(Debug, Default, PartialEq, structopt::StructOpt)] +#[derive(Debug, PartialEq, structopt::StructOpt)] pub struct StatusArgs {} /// Interacts with the device's unencrypted volume -#[derive(Debug, Default, PartialEq, structopt::StructOpt)] +#[derive(Debug, PartialEq, structopt::StructOpt)] pub struct UnencryptedArgs { #[structopt(subcommand)] subcmd: UnencryptedCommand, } /// Changes the configuration of the unencrypted volume on a Nitrokey Storage -#[derive(Debug, Default, PartialEq, structopt::StructOpt)] +#[derive(Debug, PartialEq, structopt::StructOpt)] pub struct UnencryptedSetArgs { /// The mode to change to #[structopt(name = "type")] diff --git a/src/main.rs b/src/main.rs index 831717e..9e81bf8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -86,7 +86,6 @@ use crate::error::Error; type Result<T> = result::Result<T, Error>; -const NITROCLI: &str = "nitrocli"; const NITROCLI_ADMIN_PIN: &str = "NITROCLI_ADMIN_PIN"; const NITROCLI_USER_PIN: &str = "NITROCLI_USER_PIN"; const NITROCLI_NEW_ADMIN_PIN: &str = "NITROCLI_NEW_ADMIN_PIN"; |