use std::path::PathBuf;
use clap::{ArgAction, Parser};
use crate::config::{CompareMode, HashAlgorithm, LogLevel, OutputMode, PreserveMode, VerifyMode};
#[derive(Debug, Clone, Parser)]
#[command(author, version, about = "快速、可靠的单向目录同步工具")]
pub struct Cli {
pub source: PathBuf,
pub target: PathBuf,
#[arg(short = 'n', long)]
pub dry_run: bool,
#[arg(short = 'd', long)]
pub delete: bool,
#[arg(long)]
pub follow_symlinks: bool,
#[arg(short = 'c', long, value_enum, default_value_t = CompareMode::Fast)]
pub compare: CompareMode,
#[arg(long, conflicts_with = "compare")]
pub strict: bool,
#[arg(long, value_enum, default_value_t = HashAlgorithm::Blake3)]
pub hash: HashAlgorithm,
#[arg(long, value_enum, default_value_t = VerifyMode::Changed)]
pub verify: VerifyMode,
#[arg(long = "no-sync-metadata", default_value_t = true, action = ArgAction::SetFalse)]
pub sync_metadata: bool,
#[arg(long, value_enum, default_value_t = PreserveMode::Auto)]
pub preserve_times: PreserveMode,
#[arg(long, value_enum, default_value_t = PreserveMode::Auto)]
pub preserve_permissions: PreserveMode,
#[arg(long = "no-atomic-write", default_value_t = true, action = ArgAction::SetFalse)]
pub atomic_write: bool,
#[arg(short = 't', long, default_value = "auto")]
pub threads: Option<String>,
#[arg(short = 'q', long)]
pub queue_size: Option<usize>,
#[arg(long, default_value_t = 100)]
pub max_errors: usize,
#[arg(long)]
pub stop_on_error: bool,
#[arg(short = 'l', long, value_enum, default_value_t = LogLevel::Info)]
pub log_level: LogLevel,
#[arg(short = 'o', long, value_enum, default_value_t = OutputMode::Text)]
pub output: OutputMode,
}
impl Cli {
#[cfg(test)]
pub fn for_test(source: &std::path::Path, target: &std::path::Path) -> Self {
Self {
source: source.to_path_buf(),
target: target.to_path_buf(),
dry_run: false,
delete: false,
follow_symlinks: false,
compare: CompareMode::Fast,
strict: false,
hash: HashAlgorithm::Blake3,
verify: VerifyMode::Changed,
sync_metadata: true,
preserve_times: PreserveMode::Auto,
preserve_permissions: PreserveMode::Auto,
atomic_write: true,
threads: Some("auto".to_string()),
queue_size: None,
max_errors: 100,
stop_on_error: false,
log_level: LogLevel::Info,
output: OutputMode::Text,
}
}
}