From 0aad1c4fe42e4c550a4a6225743d184b85618518 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. --- nitrocli/src/arg_util.rs | 52 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/nitrocli/src/arg_util.rs b/nitrocli/src/arg_util.rs index 68bd23f..b98aa34 100644 --- a/nitrocli/src/arg_util.rs +++ b/nitrocli/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.1