use std::result;
use std::str::FromStr;
use crate::errors::XcpError;
#[derive(Clone, Copy, Debug, Default, PartialEq)]
pub enum Reflink {
#[default]
Auto,
Always,
Never,
}
impl FromStr for Reflink {
type Err = XcpError;
fn from_str(s: &str) -> result::Result<Self, Self::Err> {
match s.to_lowercase().as_str() {
"always" => Ok(Reflink::Always),
"auto" => Ok(Reflink::Auto),
"never" => Ok(Reflink::Never),
_ => Err(XcpError::InvalidArguments(format!("Unexpected value for 'reflink': {s}"))),
}
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum Backup {
None,
Auto,
Numbered,
}
impl FromStr for Backup {
type Err = XcpError;
fn from_str(s: &str) -> result::Result<Self, Self::Err> {
match s.to_lowercase().as_str() {
"none" | "off" => Ok(Backup::None),
"auto" => Ok(Backup::Auto),
"numbered" => Ok(Backup::Numbered),
_ => Err(XcpError::InvalidArguments(format!("Unexpected value for 'backup': {s}"))),
}
}
}
#[derive(Clone, Debug)]
pub struct Config {
pub workers: usize,
pub block_size: u64,
pub gitignore: bool,
pub no_clobber: bool,
pub no_perms: bool,
pub no_timestamps: bool,
pub ownership: bool,
pub dereference: bool,
pub no_target_directory: bool,
pub fsync: bool,
pub reflink: Reflink,
pub backup: Backup,
}
impl Config {
pub(crate) fn num_workers(&self) -> usize {
if self.workers == 0 {
num_cpus::get()
} else {
self.workers
}
}
}
impl Default for Config {
fn default() -> Self {
Config {
workers: num_cpus::get(),
block_size: u64::MAX,
gitignore: false,
no_clobber: false,
no_perms: false,
no_timestamps: false,
ownership: false,
dereference: false,
no_target_directory: false,
fsync: false,
reflink: Reflink::Auto,
backup: Backup::None,
}
}
}