use clap::{Parser, Subcommand};
use semver_pub::Version;
use strum::{Display, EnumString};
#[derive(Clone, Copy, Display, EnumString, Eq, PartialEq)]
#[strum(ascii_case_insensitive)]
enum Comparator {
#[strum(serialize = "eq")]
Equal,
#[strum(serialize = "gt")]
GreaterThan,
#[strum(serialize = "gte")]
GreaterThanOrEqual,
#[strum(serialize = "lt")]
LessThan,
#[strum(serialize = "lte")]
LessThanOrEqual,
}
#[derive(Parser)]
struct CompareArgs {
version1: Version,
comparator: Comparator,
version2: Version,
}
#[derive(Parser)]
struct SeqArgs {
#[clap(long, default_value_t = false)]
minor: bool,
#[clap(long, default_value_t = 0)]
minor_max: u64,
#[clap(long, default_value_t = 0)]
patch_max: u64,
from: Version,
to: Version,
}
#[derive(Subcommand)]
enum Command {
Cmp(CompareArgs),
Seq(SeqArgs),
}
#[derive(Parser)]
struct Args {
#[clap(subcommand)]
command: Command,
}
fn main() {
let args = Args::parse();
match &args.command {
Command::Cmp(compare_args) => cmp(&args, compare_args),
Command::Seq(seq_args) => seq(&args, seq_args),
}
}
fn cmp(_args: &Args, compare_args: &CompareArgs) {
let result = match compare_args.comparator {
Comparator::Equal => compare_args.version1 == compare_args.version2,
Comparator::GreaterThan => compare_args.version1 > compare_args.version2,
Comparator::GreaterThanOrEqual => compare_args.version1 >= compare_args.version2,
Comparator::LessThan => compare_args.version1 < compare_args.version2,
Comparator::LessThanOrEqual => compare_args.version1 <= compare_args.version2,
};
if result {
println!("true");
std::process::exit(0);
} else {
println!("false");
std::process::exit(1);
}
}
fn seq(_args: &Args, seq_args: &SeqArgs) {
let mut ver = seq_args.from.clone();
loop {
if ver <= seq_args.to {
println!("{}", ver);
}
if ver >= seq_args.to {
break;
}
if ver < seq_args.to {
if seq_args.minor {
if seq_args.minor_max <= ver.minor {
ver.minor = 0;
ver.major += 1;
} else {
ver.minor += 1;
}
ver.patch = 0;
} else if seq_args.patch_max <= ver.patch {
ver.patch = 0;
if seq_args.minor_max <= ver.minor {
ver.minor = 0;
ver.major += 1;
} else {
ver.minor += 1;
}
} else {
ver.patch += 1;
}
}
}
}