From 27e73863ecffd8bc17ba970a11c41f90d686632b Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Mon, 9 Nov 2020 06:48:47 +0530 Subject: [PATCH] switch to clap's derive macros Signed-off-by: Harsh Shandilya --- src/cli.rs | 31 +++++++++++++++++++++++++++++++ src/main.rs | 51 ++++++++------------------------------------------- 2 files changed, 39 insertions(+), 43 deletions(-) create mode 100644 src/cli.rs diff --git a/src/cli.rs b/src/cli.rs new file mode 100644 index 0000000..467702a --- /dev/null +++ b/src/cli.rs @@ -0,0 +1,31 @@ +use clap::{crate_version, Clap}; + +#[derive(Clap)] +#[clap(version = crate_version!(), author = "Harsh Shandilya ")] +pub(crate) struct Opts { + #[clap(subcommand)] + pub(crate) subcommand: SubCommand, +} + +#[derive(Clap)] +pub(crate) enum SubCommand { + Freeze(Freeze), + Thaw(Thaw), +} + +/// recursively find git repos and record their states into a lockfile +#[derive(Clap)] +pub(crate) struct Freeze { + /// directory to search and freeze repos from. + pub(crate) directory: String, +} + +/// takes the given +#[derive(Clap)] +pub(crate) struct Thaw { + /// directory to put cloned repos into. + pub(crate) directory: String, + /// the lockfile to restore repositories from. + #[clap(default_value = "gitice.lock")] + pub(crate) lockfile: String, +} diff --git a/src/main.rs b/src/main.rs index 1517c76..2311644 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,54 +1,19 @@ +pub(crate) mod cli; pub(crate) mod git; pub(crate) mod model; +use clap::Clap; +use cli::Opts; +use cli::SubCommand; use git::freeze_repos; use git::thaw_repos; -use anyhow::anyhow; -use clap::{crate_version, App, AppSettings, Arg}; - fn main() -> anyhow::Result<()> { - let matches = App::new("gitice") - .about("Command-line tool for backing up and restoring multiple Git repositories from a directory") - .version(crate_version!()) - .setting(AppSettings::ColoredHelp) - .setting(AppSettings::DeriveDisplayOrder) - .setting(AppSettings::SubcommandRequiredElseHelp) - .subcommand( - App::new("freeze") - .about("Generate a gitice.lock file with all the repositories in the given directory") - .setting(AppSettings::ColoredHelp) - .args(&[Arg::new("directory") - .about("Directory to look for Git repos in") - .required(true) - .index(1)]), - ) - .subcommand( - App::new("thaw") - .about("Given a gitice.lock and a directory, clones back all the repositories from the lockfile in the directory") - .setting(AppSettings::ColoredHelp) - .args(&[ - Arg::new("directory") - .about("Directory to restore repositories in") - .required(true) - .index(1), - Arg::new("lockfile") - .about("The lockfile to restore repositories from") - .short('l') - .long("lockfile") - .required(false) - .default_value("gitice.lock") - ]), - ) - .get_matches(); + let opts = Opts::parse(); - match matches.subcommand().unwrap() { - ("freeze", m) => freeze_repos(m.value_of("directory").unwrap())?, - ("thaw", m) => thaw_repos( - m.value_of("directory").unwrap(), - m.value_of("lockfile").unwrap(), - )?, - (cmd, _) => return Err(anyhow!("unknown subcommand: {}", cmd)), + match opts.subcommand { + SubCommand::Freeze(p) => freeze_repos(&p.directory)?, + SubCommand::Thaw(p) => thaw_repos(&p.directory, &p.lockfile)?, } Ok(())