use crate::error::FsError;
use crate::error::FsErrorKind;
use crate::error::FsOperation;
use crate::error::FsResult;
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub struct CopyStats {
pub files: u64,
pub directories: u64,
pub symlinks: u64,
pub objects: u64,
pub prefixes: u64,
pub bytes: u64,
pub overwritten: u64,
pub skipped: u64,
pub failed: u64,
}
impl CopyStats {
#[inline]
pub fn add_assign(&mut self, other: &Self) -> FsResult<()> {
let add = |left: u64, right: u64| {
left.checked_add(right).ok_or_else(|| {
FsError::new(
FsErrorKind::ResourceLimitExceeded,
FsOperation::Copy,
"copy statistics counter overflow",
)
})
};
let files = add(self.files, other.files)?;
let directories = add(self.directories, other.directories)?;
let symlinks = add(self.symlinks, other.symlinks)?;
let objects = add(self.objects, other.objects)?;
let prefixes = add(self.prefixes, other.prefixes)?;
let bytes = add(self.bytes, other.bytes)?;
let overwritten = add(self.overwritten, other.overwritten)?;
let skipped = add(self.skipped, other.skipped)?;
let failed = add(self.failed, other.failed)?;
*self = Self {
files,
directories,
symlinks,
objects,
prefixes,
bytes,
overwritten,
skipped,
failed,
};
Ok(())
}
}