use log::error;
use std::error::Error;
use std::marker::PhantomData;
#[must_use]
pub struct Defer<'a, F, E>(Option<F>, PhantomData<&'a F>)
where
F: 'a + FnOnce() -> Result<(), E>,
E: Error;
impl<'a, F, E> Defer<'a, F, E>
where
F: 'a + FnOnce() -> Result<(), E>,
E: Error,
{
pub fn new(f: F) -> Defer<'a, F, E> {
Defer(Some(f), PhantomData)
}
pub fn disarm(mut self) {
self.0 = None;
drop(self);
}
}
impl<'a, F, E> ::std::ops::Drop for Defer<'a, F, E>
where
F: 'a + FnOnce() -> Result<(), E>,
E: Error,
{
fn drop(&mut self) {
if let Some(f) = self.0.take() {
if let Err(err) = f() {
error!("deferred function failed: {}", err);
}
}
}
}