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}