use std::path::PathBuf;
use clap::{Args, ValueEnum};
use harn_parser::RepairSafety;
#[derive(Debug, Args)]
pub(crate) struct FixArgs {
#[arg(long, conflicts_with = "apply")]
pub plan: bool,
#[arg(long, conflicts_with = "plan")]
pub apply: bool,
#[arg(long, requires = "apply")]
pub dry_run: bool,
#[arg(long, value_parser = parse_repair_safety, value_name = "SAFETY")]
pub safety: Option<RepairSafety>,
#[arg(long, value_enum, default_value_t = HarnessThreadingMode::LocalGlobal)]
pub harness_threading: HarnessThreadingMode,
#[arg(long)]
pub json: bool,
#[arg(required = true)]
pub path: PathBuf,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, ValueEnum)]
pub(crate) enum HarnessThreadingMode {
#[default]
LocalGlobal,
ThreadParams,
}
impl HarnessThreadingMode {
pub(crate) const fn as_str(self) -> &'static str {
match self {
Self::LocalGlobal => "local-global",
Self::ThreadParams => "thread-params",
}
}
}
impl std::fmt::Display for HarnessThreadingMode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.as_str())
}
}
fn parse_repair_safety(value: &str) -> Result<RepairSafety, String> {
value.parse::<RepairSafety>().map_err(|_| {
format!(
"unknown repair safety `{value}`; expected one of: {}",
RepairSafety::ALL
.iter()
.map(|safety| safety.as_str())
.collect::<Vec<_>>()
.join(", ")
)
})
}