| |
| 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 uwinding strategies requires linking to `std`. |
| |
| Requires Rust 1.20. |
| |
| |
| Please read the `API documentation here`__ |
| |
| __ https://docs.rs/scopeguard/ |
| |
| |build_status|_ |crates|_ |
| |
| .. |build_status| image:: https://travis-ci.org/bluss/scopeguard.svg |
| .. _build_status: https://travis-ci.org/bluss/scopeguard |
| |
| .. |crates| image:: http://meritbadge.herokuapp.com/scopeguard |
| .. _crates: https://crates.io/crates/scopeguard |
| |
| How to use |
| ---------- |
| |
| .. code:: rust |
| |
| #[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.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 ``OnUnwind`` / ``guard_on_unwind()`` / ``defer_on_unwind!{}``. |
| |
| - 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!()`` |