qubit_fs/spi/spi_write_failure.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// facade.
9//! Provider write failure facts.
10
11use crate::error::FsError;
12use crate::write::WriteFailureState;
13
14/// Typed provider write failure preserving recovery state.
15///
16/// # Examples
17///
18/// ```rust
19/// use qubit_fs::error::{FsError, FsErrorKind, FsOperation};
20/// use qubit_fs::spi::SpiWriteFailure;
21/// use qubit_fs::write::WriteFailureState;
22///
23/// let failure = SpiWriteFailure::new(
24/// FsError::new(FsErrorKind::Io, FsOperation::Write, "failed"),
25/// WriteFailureState::NotPublished,
26/// );
27/// assert_eq!(WriteFailureState::NotPublished, failure.state());
28/// ```
29pub struct SpiWriteFailure {
30 /// Provider failure with filesystem context.
31 error: FsError,
32 /// Provider-confirmed publication and recovery state.
33 state: WriteFailureState,
34}
35
36impl SpiWriteFailure {
37 /// Creates a typed provider write failure.
38 ///
39 /// # Parameters
40 /// - `error`: Provider failure with filesystem context.
41 /// - `state`: Provider-confirmed publication state.
42 ///
43 /// # Returns
44 /// A failure containing both facts.
45 #[inline]
46 #[must_use]
47 pub fn new(error: FsError, state: WriteFailureState) -> Self {
48 Self { error, state }
49 }
50
51 /// Returns the underlying error.
52 ///
53 /// # Returns
54 /// The provider failure with filesystem context.
55 #[inline]
56 #[must_use]
57 pub const fn error(&self) -> &FsError {
58 &self.error
59 }
60
61 /// Returns confirmed publication state.
62 ///
63 /// # Returns
64 /// The provider-confirmed publication state.
65 #[inline]
66 #[must_use]
67 pub const fn state(&self) -> WriteFailureState {
68 self.state
69 }
70
71 /// Returns owned failure parts.
72 ///
73 /// # Returns
74 /// The provider error and confirmed publication state.
75 #[inline]
76 #[must_use]
77 pub fn into_parts(self) -> (FsError, WriteFailureState) {
78 (self.error, self.state)
79 }
80}
81
82#[cfg(test)]
83mod tests {
84 use super::SpiWriteFailure;
85 use crate::error::FsError;
86 use crate::error::FsErrorKind;
87 use crate::error::FsOperation;
88 use crate::write::WriteFailureState;
89
90 #[test]
91 fn failure_facts_are_executed_at_runtime() {
92 let failure = SpiWriteFailure::new(
93 FsError::new(FsErrorKind::Io, FsOperation::CommitWriter, "commit failed"),
94 WriteFailureState::Published,
95 );
96 assert_eq!(failure.error().kind(), FsErrorKind::Io);
97 assert_eq!(failure.state(), WriteFailureState::Published);
98
99 let (error, state) = failure.into_parts();
100 assert_eq!(error.kind(), FsErrorKind::Io);
101 assert_eq!(state, WriteFailureState::Published);
102 }
103}