use crate::{Error, Result};
pub(crate) struct Poisonable<T> {
inner: Option<T>,
}
impl<T> Poisonable<T> {
pub(crate) fn with<R>(&mut self, f: impl FnOnce(&mut T) -> Result<R>) -> Result<R> {
let inner = match self.inner {
Some(ref mut inner) => inner,
None => return Err(Error::make_poisoned::<T>()),
};
match f(inner) {
Err(err) if err.invalid_state() => {
self.inner = None;
Err(err)
}
other_result => other_result,
}
}
#[cfg(feature = "std")]
pub(crate) fn with_ref<R>(&self, f: impl FnOnce(&T) -> Result<R>) -> Result<R> {
let inner = match self.inner {
Some(ref inner) => inner,
None => return Err(Error::make_poisoned::<T>()),
};
f(inner)
}
}
impl<T> From<T> for Poisonable<T> {
fn from(inner: T) -> Self {
Self { inner: Some(inner) }
}
}