use clap::{ArgAction, Parser};
use libxcp::config::{Backup, Config, Reflink};
use log::LevelFilter;
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.",
version,
)]
pub struct Opts {
#[arg(short, long, action = ArgAction::Count)]
pub verbose: u8,
#[arg(short, long)]
pub recursive: bool,
#[arg(short = 'L', long)]
pub dereference: 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(short = 'f', long = "force")]
pub force: 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(short, long)]
pub ownership: bool,
#[arg(long, default_value = "parfile")]
pub driver: Drivers,
#[arg(short = 'T', long)]
pub no_target_directory: bool,
#[arg(long)]
pub target_directory: Option<String>,
#[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>,
}
impl Opts {
pub fn from_args() -> Result<Opts> {
Ok(Opts::parse())
}
pub fn log_level(&self) -> LevelFilter {
match self.verbose {
0 => LevelFilter::Warn,
1 => LevelFilter::Info,
2 => LevelFilter::Debug,
_ => LevelFilter::Trace,
}
}
}
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 as u64
} else {
opts.block_size
},
gitignore: opts.gitignore,
no_clobber: opts.no_clobber,
no_perms: opts.no_perms,
no_timestamps: opts.no_timestamps,
ownership: opts.ownership,
dereference: opts.dereference,
no_target_directory: opts.no_target_directory,
fsync: opts.fsync,
reflink: opts.reflink,
backup: opts.backup,
}
}
}