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}