| # scopeguard |
| |
| 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](https://docs.rs/scopeguard/). |
| |
| Minimum supported Rust version: 1.20 |
| |
| [![build_status](https://github.com/bluss/scopeguard/actions/workflows/ci.yaml/badge.svg)](https://github.com/bluss/scopeguard/actions/workflows/ci.yaml) |
| [![crates](https://img.shields.io/crates/v/scopeguard.svg)](https://crates.io/crates/scopeguard) |
| |
| ## How to use |
| |
| ```rs |
| #[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(); |
| } |
| ``` |
| |
| ## Recent Changes |
| |
| - 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 |
| - Rename `Guard` → `ScopeGuard` |
| - Add `ScopeGuard::with_strategy`. |
| - `ScopeGuard` now implements `Debug`. |
| - Require Rust 1.11 |
| |
| - 0.2.0 |
| |
| - Require Rust 1.6 |
| - Use `no_std` unconditionally |
| - No other changes |
| |
| - 0.1.2 |
| |
| - Add macro `defer!` |