Skip to content

Commit

Permalink
Allow adding fields to an enum variant in Command!
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
robinkrahl authored and d-e-s-o committed Jan 7, 2020
1 parent 85eb8cb commit 971b6c2
Showing 1 changed file with 52 additions and 0 deletions.
52 changes: 52 additions & 0 deletions src/arg_util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down

0 comments on commit 971b6c2

Please sign in to comment.