use clap::{ArgAction, Parser};
use libxcp::config::{Config, Reflink, Backup};
use unbytify::unbytify;
use libxcp::drivers::Drivers;
use libxcp::errors::Result;
#[derive(Clone, Debug, Parser)]
#[command(
name = "xcp",
about = "A (partial) clone of the Unix `cp` command with progress and pluggable drivers.",
)]
pub struct Opts {
#[arg(short, long, action = ArgAction::Count)]
pub verbose: u8,
#[arg(short, long)]
pub recursive: bool,
#[arg(short, long, default_value = "4")]
pub workers: usize,
#[arg(long, default_value = "1MB", value_parser=unbytify)]
pub block_size: u64,
#[arg(short, long)]
pub no_clobber: bool,
#[arg(long)]
pub gitignore: bool,
#[arg(short, long)]
pub glob: bool,
#[arg(long)]
pub no_progress: bool,
#[arg(long)]
pub no_perms: bool,
#[arg(long)]
pub no_timestamps: bool,
#[arg(long, default_value = "parfile")]
pub driver: Drivers,
#[arg(short = 'T', long)]
pub no_target_directory: bool,
#[arg(long)]
pub fsync: bool,
#[arg(long, default_value = "auto")]
pub reflink: Reflink,
#[arg(long, default_value = "none")]
pub backup: Backup,
pub paths: Vec<String>,
}
pub fn parse_args() -> Result<Opts> {
Ok(Opts::parse())
}
impl From<&Opts> for Config {
fn from(opts: &Opts) -> Self {
Config {
workers: if opts.workers == 0 {
num_cpus::get()
} else {
opts.workers
},
block_size: if opts.no_progress {
usize::max_value() as u64
} else {
opts.block_size
},
gitignore: opts.gitignore,
no_clobber: opts.no_clobber,
no_perms: opts.no_perms,
no_timestamps: opts.no_timestamps,
no_target_directory: opts.no_target_directory,
fsync: opts.fsync,
reflink: opts.reflink,
backup: opts.backup,
}
}
}