use clap::Args;
use std::path::PathBuf;
#[derive(Args, Debug)]
pub struct ImportArgs {
#[arg(value_name = "FILE")]
pub file: PathBuf,
#[arg(long)]
pub dry_run: bool,
#[arg(long)]
pub merge: bool,
#[arg(long)]
pub force: bool,
#[arg(long)]
pub strict: bool,
#[arg(long)]
pub remap_ids: bool,
#[arg(long, value_name = "TASK_ID")]
pub parent: Option<String>,
}
impl ImportArgs {
pub fn is_gzipped(&self) -> bool {
self.file.extension().is_some_and(|ext| ext == "gz")
}
pub fn import_mode(&self) -> &'static str {
if self.dry_run {
"dry-run"
} else if self.merge {
if self.force {
"merge-overwrite"
} else {
"merge-skip"
}
} else if self.remap_ids {
"replace-remap"
} else {
"replace"
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_is_gzipped() {
let args = ImportArgs {
file: PathBuf::from("snapshot.json"),
dry_run: false,
merge: false,
force: false,
strict: false,
remap_ids: false,
parent: None,
};
assert!(!args.is_gzipped());
let args = ImportArgs {
file: PathBuf::from("snapshot.json.gz"),
dry_run: false,
merge: false,
force: false,
strict: false,
remap_ids: false,
parent: None,
};
assert!(args.is_gzipped());
}
#[test]
fn test_import_mode() {
let args = ImportArgs {
file: PathBuf::from("test.json"),
dry_run: true,
merge: false,
force: false,
strict: false,
remap_ids: false,
parent: None,
};
assert_eq!(args.import_mode(), "dry-run");
let args = ImportArgs {
file: PathBuf::from("test.json"),
dry_run: false,
merge: false,
force: false,
strict: false,
remap_ids: false,
parent: None,
};
assert_eq!(args.import_mode(), "replace");
let args = ImportArgs {
file: PathBuf::from("test.json"),
dry_run: false,
merge: true,
force: false,
strict: false,
remap_ids: false,
parent: None,
};
assert_eq!(args.import_mode(), "merge-skip");
let args = ImportArgs {
file: PathBuf::from("test.json"),
dry_run: false,
merge: true,
force: true,
strict: false,
remap_ids: false,
parent: None,
};
assert_eq!(args.import_mode(), "merge-overwrite");
let args = ImportArgs {
file: PathBuf::from("test.json"),
dry_run: false,
merge: false,
force: false,
strict: false,
remap_ids: true,
parent: None,
};
assert_eq!(args.import_mode(), "replace-remap");
}
}