diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/arg_util.rs | 32 | ||||
-rw-r--r-- | src/args.rs | 18 |
2 files changed, 34 insertions, 16 deletions
diff --git a/src/arg_util.rs b/src/arg_util.rs index e2e7b1d..56f8758 100644 --- a/src/arg_util.rs +++ b/src/arg_util.rs @@ -1,7 +1,7 @@ // arg_util.rs // ************************************************************************* -// * Copyright (C) 2019 Daniel Mueller (deso@posteo.net) * +// * Copyright (C) 2019-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 * @@ -24,13 +24,16 @@ macro_rules! count { } } -/// A macro for generating an enum with a set of simple (i.e., no -/// parameters) variants and their textual representations. -// TODO: Right now we hard code the derives we create. We may want to -// make this set configurable. -macro_rules! Enum { +macro_rules! Command { ( $name:ident, [ $( $var:ident => ($str:expr, $exec:expr), ) *] ) => { - Enum! {$name, [ + #[derive(Debug, PartialEq)] + pub enum $name { + $( + $var, + )* + } + + enum_int! {$name, [ $( $var => $str, )* ]} @@ -49,6 +52,13 @@ macro_rules! Enum { } } }; +} + +/// A macro for generating an enum with a set of simple (i.e., no +/// parameters) variants and their textual representations. +// TODO: Right now we hard code the derives we create. We may want to +// make this set configurable. +macro_rules! Enum { ( $name:ident, [ $( $var:ident => $str:expr, ) *] ) => { #[derive(Clone, Copy, Debug, PartialEq)] pub enum $name { @@ -57,6 +67,14 @@ macro_rules! Enum { )* } + enum_int! {$name, [ + $( $var => $str, )* + ]} + }; +} + +macro_rules! enum_int { + ( $name:ident, [ $( $var:ident => $str:expr, ) *] ) => { impl $name { #[allow(unused)] pub fn all(&self) -> [$name; count!($($var),*) ] { diff --git a/src/args.rs b/src/args.rs index 9f4cae2..0c8feb3 100644 --- a/src/args.rs +++ b/src/args.rs @@ -1,7 +1,7 @@ // args.rs // ************************************************************************* -// * Copyright (C) 2018-2019 Daniel Mueller (deso@posteo.net) * +// * 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 * @@ -128,7 +128,7 @@ impl From<DeviceModel> for nitrokey::Model { /// A top-level command for nitrocli. #[allow(unused_doc_comments)] -Enum! {Command, [ +Command! {Command, [ Config => ("config", config), Encrypted => ("encrypted", encrypted), Hidden => ("hidden", hidden), @@ -141,7 +141,7 @@ Enum! {Command, [ Unencrypted => ("unencrypted", unencrypted), ]} -Enum! {ConfigCommand, [ +Command! {ConfigCommand, [ Get => ("get", config_get), Set => ("set", config_set), ]} @@ -181,7 +181,7 @@ impl<T> ConfigOption<T> { } } -Enum! {OtpCommand, [ +Command! {OtpCommand, [ Clear => ("clear", otp_clear), Get => ("get", otp_get), Set => ("set", otp_set), @@ -213,13 +213,13 @@ Enum! {OtpSecretFormat, [ Hex => "hex", ]} -Enum! {PinCommand, [ +Command! {PinCommand, [ Clear => ("clear", pin_clear), Set => ("set", pin_set), Unblock => ("unblock", pin_unblock), ]} -Enum! {PwsCommand, [ +Command! {PwsCommand, [ Clear => ("clear", pws_clear), Get => ("get", pws_get), Set => ("set", pws_set), @@ -257,7 +257,7 @@ fn reset(ctx: &mut ExecCtx<'_>, args: Vec<String>) -> Result<()> { commands::reset(ctx) } -Enum! {UnencryptedCommand, [ +Command! {UnencryptedCommand, [ Set => ("set", unencrypted_set), ]} @@ -314,7 +314,7 @@ fn unencrypted_set(ctx: &mut ExecCtx<'_>, args: Vec<String>) -> Result<()> { commands::unencrypted_set(ctx, mode) } -Enum! {EncryptedCommand, [ +Command! {EncryptedCommand, [ Close => ("close", encrypted_close), Open => ("open", encrypted_open), ]} @@ -364,7 +364,7 @@ fn encrypted_close(ctx: &mut ExecCtx<'_>, args: Vec<String>) -> Result<()> { commands::encrypted_close(ctx) } -Enum! {HiddenCommand, [ +Command! {HiddenCommand, [ Close => ("close", hidden_close), Create => ("create", hidden_create), Open => ("open", hidden_open), |