Skip to main content

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}