use crate::params::FindDupesParams;
use super::{VALID_DUPES_MODES, push_baseline, push_global};
pub fn build_find_dupes_args(params: &FindDupesParams) -> Result<Vec<String>, String> {
let mut args = vec![
"dupes".to_string(),
"--format".to_string(),
"json".to_string(),
"--quiet".to_string(),
"--explain".to_string(),
];
push_global(
&mut args,
params.root.as_deref(),
params.config.as_deref(),
params.no_cache,
params.threads,
);
if let Some(ref workspace) = params.workspace {
args.extend(["--workspace".to_string(), workspace.clone()]);
}
if let Some(ref mode) = params.mode {
if !VALID_DUPES_MODES.contains(&mode.as_str()) {
return Err(format!(
"Invalid mode '{mode}'. Valid values: strict, mild, weak, semantic"
));
}
args.extend(["--mode".to_string(), mode.clone()]);
}
if let Some(min_tokens) = params.min_tokens {
args.extend(["--min-tokens".to_string(), min_tokens.to_string()]);
}
if let Some(min_lines) = params.min_lines {
args.extend(["--min-lines".to_string(), min_lines.to_string()]);
}
if let Some(threshold) = params.threshold {
args.extend(["--threshold".to_string(), threshold.to_string()]);
}
if params.skip_local == Some(true) {
args.push("--skip-local".to_string());
}
if params.cross_language == Some(true) {
args.push("--cross-language".to_string());
}
if let Some(top) = params.top {
args.extend(["--top".to_string(), top.to_string()]);
}
push_baseline(
&mut args,
params.baseline.as_deref(),
params.save_baseline.as_deref(),
);
if let Some(ref since) = params.changed_since {
args.push("--changed-since".to_string());
args.push(since.clone());
}
Ok(args)
}