use async_git::Result; use structopt::StructOpt; macro_rules! define_commands { ($(($name:expr, $cmd_fn:ident, $cmd_variant:ident, $opt_struct:ident),)*) => { #[derive(Debug, StructOpt)] enum Command { $( #[structopt(name = $name)] $cmd_variant(async_git::porcelain::$opt_struct), )* } async fn handle_command(cmd: Command) -> Result<()> { match cmd { $( Command::$cmd_variant(options) => async_git::porcelain::$cmd_fn(options).await?, )* }; Ok(()) } }; } define_commands!( ("init", init_cmd, Init, InitOptions), ("log", log_cmd, Log, LogOptions), ("show", show_cmd, Show, ShowOptions), ); #[tokio::main] async fn main() -> Result<()> { handle_command(Command::from_args()).await?; Ok(()) }