qubit_fs/copy/
async_copy_failure.rs1use std::error::Error;
12use std::fmt::Debug;
13use std::fmt::Display;
14use std::fmt::Formatter;
15use std::fmt::Result as FmtResult;
16
17use crate::copy::CopyFailureState;
18use crate::copy::CopyStats;
19use crate::error::FsError;
20
21pub struct AsyncCopyFailure {
36 error: FsError,
38 state: CopyFailureState,
40 partial_stats: CopyStats,
42}
43
44impl AsyncCopyFailure {
45 pub(crate) fn new(error: FsError, state: CopyFailureState, partial_stats: CopyStats) -> Self {
47 Self {
48 error,
49 state,
50 partial_stats,
51 }
52 }
53
54 #[inline]
56 #[must_use]
57 pub const fn error(&self) -> &FsError {
58 &self.error
59 }
60
61 #[inline]
63 #[must_use]
64 pub const fn state(&self) -> CopyFailureState {
65 self.state
66 }
67
68 #[inline]
70 #[must_use]
71 pub const fn partial_stats(&self) -> &CopyStats {
72 &self.partial_stats
73 }
74
75 #[inline]
77 #[must_use]
78 pub fn into_parts(self) -> (FsError, CopyFailureState, CopyStats) {
79 (self.error, self.state, self.partial_stats)
80 }
81}
82
83impl Debug for AsyncCopyFailure {
84 #[inline]
86 fn fmt(&self, formatter: &mut Formatter<'_>) -> FmtResult {
87 formatter
88 .debug_struct("AsyncCopyFailure")
89 .field("error", &self.error)
90 .field("state", &self.state)
91 .field("partial_stats", &self.partial_stats)
92 .finish()
93 }
94}
95
96impl Display for AsyncCopyFailure {
97 #[inline]
99 fn fmt(&self, formatter: &mut Formatter<'_>) -> FmtResult {
100 Display::fmt(self.error(), formatter)
101 }
102}
103
104impl Error for AsyncCopyFailure {
105 #[inline]
107 fn source(&self) -> Option<&(dyn Error + 'static)> {
108 Some(self.error())
109 }
110}
111
112#[cfg(test)]
113mod tests {
114 use super::AsyncCopyFailure;
115 use crate::copy::CopyFailureState;
116 use crate::copy::CopyStats;
117 use crate::error::FsError;
118 use crate::error::FsErrorKind;
119 use crate::error::FsOperation;
120
121 #[test]
122 fn owned_parts_are_executed_at_runtime() {
123 let failure = AsyncCopyFailure::new(
124 FsError::new(FsErrorKind::NotFound, FsOperation::Copy, "missing source"),
125 CopyFailureState::Unchanged,
126 CopyStats {
127 files: 1,
128 ..CopyStats::default()
129 },
130 );
131
132 let (error, state, stats) = failure.into_parts();
133 assert_eq!(error.kind(), FsErrorKind::NotFound);
134 assert_eq!(state, CopyFailureState::Unchanged);
135 assert_eq!(stats.files, 1);
136 }
137}