Rust crate for a convenient RAII scope guard that will run a given closure when it goes out of scope, even if the code between panics (assuming unwinding panic).
The defer! macro and guard are no_std compatible (require only core),
but the on unwinding / not on unwinding strategies require linking to std.
By default, the use_std crate feature is enabled. Disable the default features
for no_std support.
Please read the API documentation here.
Minimum supported Rust version: 1.20
#[macro_use(defer)]
extern crate scopeguard;
use scopeguard::guard;
fn f() {
defer! {
println!("Called at return or panic");
}
panic!();
}
use std::fs::File;
use std::io::Write;
fn g() {
let f = File::create("newfile.txt").unwrap();
let mut file = guard(f, |f| {
// write file at return or panic
let _ = f.sync_all();
});
// access the file through the scope guard itself
file.write_all(b"test me\n").unwrap();
}
1.2.0
Use ManuallyDrop instead of mem::forget in into_inner. (by @willtunnels)
Warn if the guard is not assigned to a variable and is dropped immediately instead of at the scope's end. (by @sergey-v-galtsev)
1.1.0
Change macros (defer!, defer_on_success! and defer_on_unwind!)
to accept statements. (by @konsumlamm)
1.0.0
Change the closure type from FnMut(&mut T) to FnOnce(T):
Passing the inner value by value instead of a mutable reference is a
breaking change, but allows the guard closure to consume it. (by @tormol)
Add defer_on_success!, guard_on_success() and OnSuccess
strategy, which triggers when scope is exited without panic. It's the
opposite to defer_on_unwind! / guard_on_unwind() / OnUnwind.
Add ScopeGuard::into_inner(), which "defuses" the guard and returns the
guarded value. (by @tormol)
Implement Sync for guards with non-Sync closures.
Require Rust 1.20
0.3.3
Use #[inline] on a few more functions by @stjepang (#14)
Add examples to crate documentation
0.3.2
Add crate categories
0.3.1
Add defer_on_unwind!, Strategy trait
Guard → ScopeGuardScopeGuard::with_strategy.ScopeGuard now implements Debug.Require Rust 1.11
0.2.0
Require Rust 1.6
no_std unconditionallyNo other changes
0.1.2
Add macro defer!
$ claude mcp add scopeguard \
-- python -m otcore.mcp_server <graph>