1#[doc(hidden)]
2#[derive(Debug)]
3pub struct Defer<F: FnOnce()>(Option<F>);
4
5impl<F: FnOnce()> Defer<F> {
6 #[doc(hidden)]
7 pub fn new(f: F) -> Self {
8 Defer(Some(f))
9 }
10}
11
12impl<F: FnOnce()> Drop for Defer<F> {
13 fn drop(&mut self) {
14 if let Some(f) = self.0.take() {
15 f();
16 }
17 }
18}
19
20#[macro_export]
21macro_rules! defer_async {
22 ($e:expr) => {
23 let _defer_guard = $crate::defer::Defer::new(|| {
24 tokio::spawn(async move { $e });
25 });
26 };
27}
28
29#[macro_export]
30macro_rules! defer {
31 ($e:expr) => {
32 let _defer_guard = $crate::Defer::new(|| $e);
33 };
34}