pub mod parfile;
#[cfg(feature = "parblock")]
pub mod parblock;
use std::path::{Path, PathBuf};
use std::result;
use std::str::FromStr;
use std::sync::Arc;
use crate::config::Config;
use crate::errors::{Result, XcpError};
use crate::feedback::StatusUpdater;
pub trait CopyDriver {
fn copy(&self, sources: Vec<PathBuf>, dest: &Path, stats: Arc<dyn StatusUpdater>) -> Result<()>;
}
#[derive(Debug, Clone, Copy)]
pub enum Drivers {
ParFile,
#[cfg(feature = "parblock")]
ParBlock,
}
impl FromStr for Drivers {
type Err = XcpError;
fn from_str(s: &str) -> result::Result<Self, Self::Err> {
match s.to_lowercase().as_str() {
"parfile" => Ok(Drivers::ParFile),
#[cfg(feature = "parblock")]
"parblock" => Ok(Drivers::ParBlock),
_ => Err(XcpError::UnknownDriver(s.to_owned())),
}
}
}
pub fn load_driver(driver: Drivers, config: &Arc<Config>) -> Result<Box<dyn CopyDriver + Send>> {
let driver_impl: Box<dyn CopyDriver + Send> = match driver {
Drivers::ParFile => Box::new(parfile::Driver::new(config.clone())?),
#[cfg(feature = "parblock")]
Drivers::ParBlock => Box::new(parblock::Driver::new(config.clone())?),
};
Ok(driver_impl)
}