Skip to main content

qubit_fs/copy/
copy_stats.rs

1// =============================================================================
2//    Copyright (c) 2026 Haixing Hu.
3//
4//    SPDX-License-Identifier: Apache-2.0
5//
6//    Licensed under the Apache License, Version 2.0.
7// =============================================================================
8//! Copy operation statistics.
9
10use crate::error::FsError;
11use crate::error::FsErrorKind;
12use crate::error::FsOperation;
13use crate::error::FsResult;
14
15/// Statistics collected during copy operations.
16///
17/// # Examples
18///
19/// ```rust
20/// use qubit_fs::copy::CopyStats;
21///
22/// let stats = CopyStats { files: 3, ..CopyStats::default() };
23/// assert_eq!(3, stats.files);
24/// ```
25#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
26pub struct CopyStats {
27    /// Number of regular files copied.
28    pub files: u64,
29    /// Number of directories created or copied.
30    pub directories: u64,
31    /// Number of symbolic links copied.
32    pub symlinks: u64,
33    /// Number of object-store objects copied.
34    pub objects: u64,
35    /// Number of object-store prefixes or collection resources copied.
36    pub prefixes: u64,
37    /// Number of content bytes copied.
38    pub bytes: u64,
39    /// Number of destination entries overwritten.
40    pub overwritten: u64,
41    /// Number of entries skipped.
42    pub skipped: u64,
43    /// Number of failed entries when continue-on-error is enabled.
44    pub failed: u64,
45}
46
47impl CopyStats {
48    /// Adds another statistics value into this one.
49    ///
50    /// # Parameters
51    /// - `other`: Statistics to add.
52    ///
53    /// # Errors
54    /// Returns [`FsErrorKind::ResourceLimitExceeded`] when any counter would
55    /// overflow `u64`. The receiver remains unchanged on overflow.
56    #[inline]
57    pub fn add_assign(&mut self, other: &Self) -> FsResult<()> {
58        let add = |left: u64, right: u64| {
59            left.checked_add(right).ok_or_else(|| {
60                FsError::new(
61                    FsErrorKind::ResourceLimitExceeded,
62                    FsOperation::Copy,
63                    "copy statistics counter overflow",
64                )
65            })
66        };
67        let files = add(self.files, other.files)?;
68        let directories = add(self.directories, other.directories)?;
69        let symlinks = add(self.symlinks, other.symlinks)?;
70        let objects = add(self.objects, other.objects)?;
71        let prefixes = add(self.prefixes, other.prefixes)?;
72        let bytes = add(self.bytes, other.bytes)?;
73        let overwritten = add(self.overwritten, other.overwritten)?;
74        let skipped = add(self.skipped, other.skipped)?;
75        let failed = add(self.failed, other.failed)?;
76        *self = Self {
77            files,
78            directories,
79            symlinks,
80            objects,
81            prefixes,
82            bytes,
83            overwritten,
84            skipped,
85            failed,
86        };
87        Ok(())
88    }
89}