#[doc(hidden)] pub struct Defer { // internal struct used by defer! macro func: Option, } impl Defer { pub fn new(func: F) -> Self { Self { func: Some(func) } } } impl Drop for Defer { fn drop(&mut self) { self.func.take().map(|f| f()); } } #[macro_export] macro_rules! defer { ( $($tt:tt)* ) => { let _deferred = $crate::common::defer::Defer::new(|| { $($tt)* }); }; }