use std::error::Error;
use std::fs::{copy, hard_link};
use std::os::unix::fs::symlink;
use std::path::Path;
use log::debug;
pub trait CopyStratTrait {
fn run(&self, source: &Path, destination: &Path) -> Result<(), Box<dyn Error>>;
}
pub struct FileCopyStrat {}
impl CopyStratTrait for FileCopyStrat {
fn run(&self, source: &Path, destination: &Path) -> Result<(), Box<dyn Error>> {
copy(source, destination)?;
Ok(())
}
}
pub struct FileHardlinkStrat {}
impl CopyStratTrait for FileHardlinkStrat {
fn run(&self, source: &Path, destination: &Path) -> Result<(), Box<dyn Error>> {
hard_link(source, destination)?;
debug!("Linked {:?} to {:?}", destination, source);
Ok(())
}
}
pub struct FileSymlinkStrat {}
impl CopyStratTrait for FileSymlinkStrat {
fn run(&self, source: &Path, destination: &Path) -> Result<(), Box<dyn Error>> {
symlink(source, destination)?;
debug!("Linked {:?} to {:?}", destination, source);
Ok(())
}
}