use std::{ffi, path};
use structopt::{clap, StructOpt};
#[derive(StructOpt)]
pub struct Options {
#[structopt(flatten)]
pub command: Command,
}
#[derive(StructOpt)]
pub struct BaseOptions {
#[structopt(
short = "-d",
long = "--base-dir",
env = "GIT_PROJECT_BASE_DIR",
parse(try_from_os_str = "parse_canonical_path")
)]
pub base_dir: path::PathBuf,
}
#[derive(StructOpt)]
pub enum Command {
#[structopt(name = "clone")]
Clone(CloneOptions),
#[structopt(name = "list")]
List(ListOptions),
#[structopt(name = "check")]
Check(CheckOptions),
#[structopt(name = "organize")]
Organize(OrganizeOptions),
#[structopt(name = "gen-completions")]
GenCompletions(CompletionOptions),
}
#[derive(StructOpt)]
pub struct CloneOptions {
#[structopt(flatten)]
pub base: BaseOptions,
#[structopt(short = "-n", long = "--dry-run")]
pub only_print_location: bool,
#[structopt(name = "URL")]
pub clone_url: String,
}
#[derive(StructOpt)]
pub struct ListOptions {
#[structopt(flatten)]
pub base: BaseOptions,
#[structopt(flatten)]
pub list: BaseListOptions,
}
#[derive(StructOpt)]
pub struct BaseListOptions {
#[structopt(short = "-r", long = "--deep-recurse")]
pub deep_recurse: bool,
}
#[derive(StructOpt)]
pub struct CheckOptions {
#[structopt(flatten)]
pub list: BaseListOptions,
#[structopt(flatten)]
pub base: BaseOptions,
#[structopt(short = "-s", long = "--summarize")]
pub summarize: bool,
}
#[derive(StructOpt)]
pub struct OrganizeOptions {
#[structopt(name = "DIR", parse(from_os_str))]
pub dir: path::PathBuf,
#[structopt(name = "NEW_DIR", parse(from_os_str))]
pub new_dir: path::PathBuf,
#[structopt(short = "-n", long = "--dry-run")]
pub dry_run: bool,
}
#[derive(StructOpt)]
pub struct CompletionOptions {
#[structopt(
name = "SHELL",
raw(
possible_values = "&clap::Shell::variants()",
case_insensitive = "true"
)
)]
pub shell: clap::Shell,
}
fn parse_canonical_path(path_str: &ffi::OsStr) -> Result<path::PathBuf, ffi::OsString> {
path::Path::new(path_str).canonicalize().map_err(|err| {
ffi::OsString::from(format!(
"Unable to recognize base directory as absolute path: {}",
err
))
})
}