aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Krahl <robin.krahl@ireas.org>2020-01-07 12:42:28 +0000
committerDaniel Mueller <deso@posteo.net>2020-01-08 09:20:46 -0800
commit0aad1c4fe42e4c550a4a6225743d184b85618518 (patch)
tree40c7de09d4dd4ba155c4596609ad5199cc769c81
parent2dcceb1d5889f6eac6262f38506c58066a898f76 (diff)
downloadnitrocli-0aad1c4fe42e4c550a4a6225743d184b85618518.tar.gz
nitrocli-0aad1c4fe42e4c550a4a6225743d184b85618518.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--nitrocli/src/arg_util.rs52
1 files changed, 52 insertions, 0 deletions
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<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 {