use clap::Args;
#[derive(Args)]
pub(crate) struct RunExtrasArgs {
#[arg(long, num_args = 0..=1, default_missing_value = "auto", value_name = "BOX", conflicts_with_all = ["sandbox", "container"])]
pub(crate) remote_build: Option<String>,
#[arg(long, num_args(1..))]
pub(crate) context_from: Vec<String>,
#[arg(long, num_args(1..))]
pub(crate) skill: Vec<String>,
#[arg(long)]
pub(crate) template: Option<String>,
#[arg(long)]
pub(crate) on_done: Option<String>,
#[arg(long, value_delimiter = ',')]
pub(crate) cascade: Vec<String>,
#[arg(long)]
pub(crate) hook: Vec<String>,
#[arg(long, value_name = "TARGET[:FOLDER]", conflicts_with = "no_backup")]
pub(crate) backup: Option<String>,
#[arg(long)]
pub(crate) no_backup: bool,
}
#[cfg(test)]
mod tests {
use super::RunExtrasArgs;
use clap::Parser;
#[derive(Parser)]
struct Probe {
#[command(flatten)]
extras: RunExtrasArgs,
#[arg(long)]
sandbox: bool,
#[arg(long)]
container: Option<String>,
}
#[test]
fn backup_flag_takes_target_and_optional_folder() {
let probe = Probe::try_parse_from(["aid", "--backup", "gdrive:audits/{project}"]).unwrap();
assert_eq!(probe.extras.backup.as_deref(), Some("gdrive:audits/{project}"));
assert!(!probe.extras.no_backup);
let probe = Probe::try_parse_from(["aid", "--no-backup"]).unwrap();
assert!(probe.extras.no_backup);
}
#[test]
fn backup_and_no_backup_conflict() {
assert!(Probe::try_parse_from(["aid", "--backup", "gdrive", "--no-backup"]).is_err());
}
}