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;