async-git 0.0.0-squat-name

Pure-rust async implementation of git built on tokio
Documentation
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(())
}