Skip to main content

qubit_fs/write/
async_writer_recovery.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//! Ownership retained after an aggregate write or copy failure.
9
10use std::fmt::Debug;
11use std::fmt::Formatter;
12use std::fmt::Result as FmtResult;
13
14use crate::write::AsyncFileWriter;
15use crate::write::RejectedAsyncWriter;
16
17/// A retained session that is either validated or restricted to explicit
18/// cleanup.
19///
20/// Matching the variant is required before performing recovery. A rejected
21/// session cannot write or publish data. This value does not describe the
22/// historical publication state; use the failure snapshot for that fact.
23///
24/// # Examples
25///
26/// ```rust
27/// use qubit_fs::write::AsyncWriterRecovery;
28///
29/// fn observe(_recovery: AsyncWriterRecovery) {}
30/// ```
31#[must_use]
32pub enum AsyncWriterRecovery {
33    /// A validated writer retained for explicit recovery.
34    Opened(Box<AsyncFileWriter>),
35    /// A provider session whose returned identity failed validation.
36    Rejected(RejectedAsyncWriter),
37}
38
39impl AsyncWriterRecovery {
40    /// Borrows a validated writer, or returns None for a rejected session.
41    pub(crate) fn opened(&self) -> Option<&AsyncFileWriter> {
42        match self {
43            Self::Opened(writer) => Some(writer),
44            Self::Rejected(_) => None,
45        }
46    }
47
48    /// Mutably borrows a validated writer, or returns None for a rejected
49    /// session.
50    pub(crate) fn opened_mut(&mut self) -> Option<&mut AsyncFileWriter> {
51        match self {
52            Self::Opened(writer) => Some(writer),
53            Self::Rejected(_) => None,
54        }
55    }
56}
57
58impl Debug for AsyncWriterRecovery {
59    /// Formats the variant without exposing provider session internals.
60    fn fmt(&self, formatter: &mut Formatter<'_>) -> FmtResult {
61        formatter.write_str(match self {
62            Self::Opened(_) => "AsyncWriterRecovery::Opened",
63            Self::Rejected(_) => "AsyncWriterRecovery::Rejected",
64        })
65    }
66}