diff options
author | Robin Krahl <robin.krahl@ireas.org> | 2020-01-07 12:42:28 +0000 |
---|---|---|
committer | Daniel Mueller <deso@posteo.net> | 2020-01-07 12:42:28 +0000 |
commit | 971b6c22a7f3d70840ca373bc54fcdae1f86262a (patch) | |
tree | ad54bbf2cde9528be95127f263cb4458ea2a3c6c | |
parent | 85eb8cb7bc94570550d88526585d55973610b9bd (diff) | |
download | nitrocli-971b6c22a7f3d70840ca373bc54fcdae1f86262a.tar.gz nitrocli-971b6c22a7f3d70840ca373bc54fcdae1f86262a.tar.bz2 |
Allow adding fields to an enum variant in Command!
To be able to use the enums generated by Command! with structopt, we
have to be able to add fields to them. This patch adds a new variant to
the Command! macro that supports fields.
-rw-r--r-- | src/arg_util.rs | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/arg_util.rs b/src/arg_util.rs index 317d9e3..06a6ee6 100644 --- a/src/arg_util.rs +++ b/src/arg_util.rs @@ -25,6 +25,58 @@ macro_rules! count { } macro_rules! Command { + ( $name:ident, [ $( $var:ident($inner:ident) => ($str:expr, $exec:expr), ) *] ) => { + #[derive(Debug, PartialEq, structopt::StructOpt)] + pub enum $name { + $( + $var($inner), + )* + } + + 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( + self, + ctx: &mut crate::args::ExecCtx<'_>, + args: ::std::vec::Vec<::std::string::String>, + ) -> crate::Result<()> { + match self { + $( + $name::$var(_) => $exec(ctx, args), + )* + } + } + } + }; ( $name:ident, [ $( $var:ident => ($str:expr, $exec:expr), ) *] ) => { #[derive(Debug, PartialEq)] pub enum $name { |