Skip to main content

tuwunel_core/utils/
defer.rs

1#[macro_export]
2macro_rules! defer {
3	($body:block) => {
4		struct _Defer_<F: FnMut()> {
5			closure: F,
6		}
7
8		impl<F: FnMut()> Drop for _Defer_<F> {
9			fn drop(&mut self) { (self.closure)(); }
10		}
11
12		let _defer_ = _Defer_ { closure: || $body };
13	};
14
15	($body:expr_2021) => {
16		$crate::defer! {{ $body }}
17	};
18}
19
20#[macro_export]
21macro_rules! scope_restore {
22	($val:ident, $ours:expr_2021) => {
23		let theirs = $crate::utils::exchange($val, $ours);
24		$crate::defer! {{ *$val = theirs; }};
25	};
26}