From 971b6c22a7f3d70840ca373bc54fcdae1f86262a Mon Sep 17 00:00:00 2001 From: Robin Krahl Date: Tue, 7 Jan 2020 12:42:28 +0000 Subject: 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. --- src/arg_util.rs | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) 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 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 { + 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 { -- cgit v1.2.3