use structopt::clap::AppSettings::{ColorAuto, ColoredHelp, DisableVersion};
use structopt::StructOpt;
#[derive(StructOpt, Debug)]
#[structopt(name = "git-release", about = "Make a github release for tags")]
#[structopt(no_version, global_settings = &[DisableVersion])]
#[structopt(setting(ColorAuto), setting(ColoredHelp))]
pub struct Opt {
#[structopt(short, long)]
tag: Option<String>,
#[structopt(subcommand)]
pub sub_commands: Option<Command>,
#[structopt(skip)]
pub tags: Tag,
#[structopt(short, long, default_value = "origin")]
pub remote: String,
#[structopt(short, long)]
pub publish: bool,
#[structopt(long, env, hide_env_values = true)]
pub github_token: String,
#[structopt(short, long)]
pub force: bool,
}
#[derive(StructOpt, Debug)]
pub enum Command {
Version,
Publish,
}
impl Opt {
pub fn new() -> Opt {
let mut opt = Opt::from_args();
if let Some(ref tag) = opt.tag {
if !tag.contains("..") {
opt.tags = Tag::Single(tag.clone());
} else if tag.ends_with("..") {
opt.tags = Tag::From(tag.strip_suffix("..").unwrap().to_owned());
} else {
let mut splits = tag.split("..");
let from = splits.next().unwrap().to_owned();
let to = splits.next().unwrap().to_owned();
opt.tags = Tag::Range(from, to);
}
}
opt
}
}
#[derive(Debug)]
pub enum Tag {
None,
Single(String),
From(String),
Range(String, String),
}
impl Default for Tag {
fn default() -> Self {
Tag::None
}
}