pars_core/util/
defer.rs

1pub struct Defer<F: FnOnce()> {
2    f: Option<F>,
3}
4
5impl<F: FnOnce()> Defer<F> {
6    pub fn new(f: F) -> Self {
7        Defer { f: Some(f) }
8    }
9}
10
11impl<F: FnOnce()> Drop for Defer<F> {
12    fn drop(&mut self) {
13        if let Some(f) = self.f.take() {
14            f();
15        }
16    }
17}
18
19#[cfg(test)]
20macro_rules! cleanup {
21    ($test:block, $cleanup:block) => {{
22        let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| $test));
23        $cleanup;
24        if let Err(err) = result {
25            std::panic::resume_unwind(err);
26        }
27    }};
28}
29
30#[cfg(test)]
31pub(crate) use cleanup;