use crate::VERSION;
use ajour_core::{config::Flavor, repository::CompressionFormat};
use isahc::http::Uri;
use structopt::{
clap::{self, AppSettings},
StructOpt,
};
use std::env;
use std::path::PathBuf;
pub fn get_opts() -> Result<Opts, clap::Error> {
let args = env::args_os();
Opts::from_iter_safe(args)
}
#[allow(unused_variables)]
pub fn validate_opts_or_exit(
opts_result: Result<Opts, clap::Error>,
is_cli: bool,
is_debug: bool,
) -> Opts {
let is_opts_error = opts_result.is_err();
#[cfg(target_os = "windows")]
{
if (is_cli || is_opts_error) && !is_debug {
use winapi::um::wincon::{AttachConsole, ATTACH_PARENT_PROCESS};
unsafe {
AttachConsole(ATTACH_PARENT_PROCESS);
}
}
}
match opts_result {
Ok(opts) => opts,
Err(e) => {
#[cfg(target_os = "windows")]
{
if !is_debug && e.kind == clap::ErrorKind::VersionDisplayed {
print!("Ajour {}", VERSION);
}
}
e.exit();
}
}
}
#[derive(Debug, StructOpt)]
#[structopt(name = "Ajour",
about = env!("CARGO_PKG_DESCRIPTION"),
version = VERSION,
author = env!("CARGO_PKG_AUTHORS"),
setting = AppSettings::DisableHelpSubcommand)]
pub struct Opts {
#[structopt(long = "data", help = "Path to a custom data directory for the app")]
pub data_directory: Option<PathBuf>,
#[structopt(long = "aa", help = "Enable / Disable Anti-aliasing (true / false)")]
pub antialiasing: Option<bool>,
#[structopt(subcommand)]
pub command: Option<Command>,
#[structopt(long, hidden = true)]
pub self_update_temp: Option<PathBuf>,
}
#[derive(Debug, StructOpt)]
pub enum Command {
Update,
UpdateAddons,
UpdateWeakauras,
Install {
#[structopt(parse(try_from_str = str_to_flavor), possible_values = &["retail","ptr","beta","classic","classic_ptr","classic_beta"])]
flavor: Flavor,
#[structopt()]
url: Uri,
},
Backup {
#[structopt(short, long, default_value = "both", parse(try_from_str = str_to_backup_folder), possible_values = &["both","wtf","addons"])]
backup_folder: BackupFolder,
#[structopt(short, long, parse(try_from_str = str_to_flavor), possible_values = &["retail","ptr","beta","classic","classic_ptr","classic_beta"])]
flavors: Vec<Flavor>,
#[structopt()]
destination: PathBuf,
#[structopt(short, long, default_value = "zip", possible_values = &["zip", "zstd"])]
compression_format: CompressionFormat,
},
}
fn str_to_flavor(s: &str) -> Result<Flavor, &'static str> {
match s {
"retail" => Ok(Flavor::Retail),
"beta" => Ok(Flavor::RetailBeta),
"ptr" => Ok(Flavor::RetailPtr),
"classic" => Ok(Flavor::Classic),
"classic_ptr" => Ok(Flavor::ClassicPtr),
"classic_beta" => Ok(Flavor::ClassicBeta),
_ => Err("valid values are ['retail','ptr','beta','classic','classic_ptr','classic_beta']"),
}
}
#[derive(Debug, Clone, Copy)]
pub enum BackupFolder {
Both,
AddOns,
Wtf,
}
fn str_to_backup_folder(s: &str) -> Result<BackupFolder, &'static str> {
match s {
"both" => Ok(BackupFolder::Both),
"wtf" => Ok(BackupFolder::Wtf),
"addons" => Ok(BackupFolder::AddOns),
_ => Err("valid values are ['both','wtf','addons']"),
}
}