use std::error::Error;
use std::fmt::Debug;
use std::fmt::Display;
use std::fmt::Formatter;
use std::fmt::Result as FmtResult;
use super::FsError;
use super::OpenFailureStage;
#[must_use = "inspect and retain recovery ownership before abandoning an open failure"]
pub struct OpenFailure<R> {
error: Box<FsError>,
stage: OpenFailureStage,
recovery: Option<R>,
}
impl<R> OpenFailure<R> {
pub(crate) fn new(error: FsError, stage: OpenFailureStage, recovery: Option<R>) -> Self {
Self {
error: Box::new(error),
stage,
recovery,
}
}
pub const fn error(&self) -> &FsError {
&self.error
}
pub const fn stage(&self) -> OpenFailureStage {
self.stage
}
pub const fn recovery(&self) -> Option<&R> {
self.recovery.as_ref()
}
pub fn recovery_mut(&mut self) -> Option<&mut R> {
self.recovery.as_mut()
}
pub fn take_recovery(&mut self) -> Option<R> {
self.recovery.take()
}
pub fn into_parts(self) -> (FsError, OpenFailureStage, Option<R>) {
(*self.error, self.stage, self.recovery)
}
}
impl<R> Debug for OpenFailure<R> {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
f.debug_struct("OpenFailure")
.field("error", &self.error)
.field("stage", &self.stage)
.field("has_recovery", &self.recovery.is_some())
.finish()
}
}
impl<R> Display for OpenFailure<R> {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
Display::fmt(&self.error, f)
}
}
impl<R: 'static> Error for OpenFailure<R> {
fn source(&self) -> Option<&(dyn Error + 'static)> {
Some(self.error.as_ref())
}
}