Skip to main content

zimq_impl/
defer.rs

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}