use crate::BoxliteError;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CopySourceKind {
Unknown,
File,
Dir,
}
impl CopySourceKind {
pub fn to_wire(self) -> Option<bool> {
match self {
Self::Unknown => None,
Self::File => Some(false),
Self::Dir => Some(true),
}
}
pub fn from_wire(source_is_dir: Option<bool>) -> Self {
match source_is_dir {
None => Self::Unknown,
Some(false) => Self::File,
Some(true) => Self::Dir,
}
}
pub fn is_dir(self) -> bool {
matches!(self, Self::Dir)
}
}
#[derive(Debug, Clone)]
pub struct CopyOptions {
pub recursive: bool,
pub overwrite: bool,
pub follow_symlinks: bool,
}
impl Default for CopyOptions {
fn default() -> Self {
Self {
recursive: true,
overwrite: true,
follow_symlinks: false,
}
}
}
impl CopyOptions {
pub fn no_overwrite(mut self) -> Self {
self.overwrite = false;
self
}
pub fn non_recursive(mut self) -> Self {
self.recursive = false;
self
}
pub fn follow_symlinks(mut self, follow: bool) -> Self {
self.follow_symlinks = follow;
self
}
pub fn validate_for_dir(&self) -> Result<(), BoxliteError> {
if !self.recursive {
return Err(BoxliteError::Config(
"recursive=false not supported for directory copies".into(),
));
}
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn source_kind_encodes_the_guest_protocol_hint() {
assert_eq!(CopySourceKind::Unknown.to_wire(), None);
assert_eq!(CopySourceKind::File.to_wire(), Some(false));
assert_eq!(CopySourceKind::Dir.to_wire(), Some(true));
assert_eq!(CopySourceKind::from_wire(None), CopySourceKind::Unknown);
assert_eq!(CopySourceKind::from_wire(Some(false)), CopySourceKind::File);
assert_eq!(CopySourceKind::from_wire(Some(true)), CopySourceKind::Dir);
}
#[test]
fn only_dir_reports_a_directory_source() {
assert!(CopySourceKind::Dir.is_dir());
assert!(!CopySourceKind::File.is_dir());
assert!(!CopySourceKind::Unknown.is_dir());
}
}