use crate::completion_shell::CompletionShell;
use crate::targets::{Target, parse_targets};
use clap::Parser;
use std::{collections::HashSet, path::PathBuf};
#[derive(Debug, Parser)]
pub struct CompletionsOpts {
#[arg(short = 'l', long, default_value = "info", value_parser = ["debug", "info", "warn", "error"])]
pub log_level: String,
pub shell: CompletionShell,
}
#[derive(Debug, Parser)]
pub struct InstallOpts {
#[arg(short = 'd', long, value_parser = ["x86_64-unknown-linux-gnu", "aarch64-unknown-linux-gnu", "x86_64-pc-windows-msvc", "x86_64-pc-windows-gnu" , "x86_64-apple-darwin" , "aarch64-apple-darwin"])]
pub default_host: Option<String>,
#[arg(short = 'r', long)]
pub esp_riscv_gcc: bool,
#[arg(short = 'f', long, env = "ESPUP_EXPORT_FILE")]
pub export_file: Option<PathBuf>,
#[arg(long, env = "ESPUP_DISABLE_TIMEOUTS")]
pub disable_timeouts: bool,
#[arg(short = 'e', long)]
pub extended_llvm: bool,
#[arg(short = 'l', long, default_value = "info", value_parser = ["debug", "info", "warn", "error"])]
pub log_level: String,
#[arg(short = 'a', long, default_value = "esp")]
pub name: String,
#[arg(short = 'b', long, default_value = "stable")]
pub stable_version: String,
#[arg(short = 'k', long, requires = "toolchain_version")]
pub skip_version_parse: bool,
#[arg(short = 's', long)]
pub std: bool,
#[arg(short = 't', long, default_value = "all", value_parser = parse_targets)]
pub targets: HashSet<Target>,
#[arg(short = 'v', long)]
pub toolchain_version: Option<String>,
#[arg(short = 'c', long)]
pub crosstool_toolchain_version: Option<String>,
}
#[derive(Debug, Parser)]
pub struct UninstallOpts {
#[arg(short = 'l', long, default_value = "info", value_parser = ["debug", "info", "warn", "error"])]
pub log_level: String,
#[arg(short = 'a', long, default_value = "esp")]
pub name: String,
#[arg(short = 'c', long)]
pub crosstool_toolchain_version: Option<String>,
}
#[cfg(test)]
mod tests {
use super::InstallOpts;
use clap::Parser;
#[test]
fn install_accepts_disable_timeouts_flag() {
let opts = InstallOpts::try_parse_from(["espup", "--disable-timeouts"]).unwrap();
assert!(opts.disable_timeouts);
}
#[test]
fn install_accepts_disable_timeouts_env_var() {
unsafe {
std::env::set_var("ESPUP_DISABLE_TIMEOUTS", "true");
}
let opts = InstallOpts::try_parse_from(["espup"]).unwrap();
unsafe {
std::env::remove_var("ESPUP_DISABLE_TIMEOUTS");
}
assert!(opts.disable_timeouts);
}
}