#panic #scope-guard #defer #unwind

no-std scopeguard

A RAII scope guard that will run a given closure when it goes out of scope, even if the code between panics (assuming unwinding panic). Defines the macros defer!, defer_on_unwind!, defer_on_success! as shorthands for guards with one of the implemented strategies

9 releases (1 stable)

1.0.0 Dec 19, 2018
0.3.3 Oct 13, 2017
0.3.2 Jan 21, 2017
0.3.1 Dec 11, 2016
0.1.0 Apr 30, 2015

#1 in Rust patterns

Download history 43110/week @ 2018-10-05 45954/week @ 2018-10-12 43336/week @ 2018-10-19 51316/week @ 2018-10-26 48778/week @ 2018-11-02 50201/week @ 2018-11-09 48023/week @ 2018-11-16 45243/week @ 2018-11-23 52765/week @ 2018-11-30 58972/week @ 2018-12-07 54525/week @ 2018-12-14 34592/week @ 2018-12-21 46397/week @ 2018-12-28 57452/week @ 2019-01-04 62961/week @ 2019-01-11

208,727 downloads per month
Used in 2,684 crates (21 directly)

MIT/Apache

21KB
245 lines

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

build_status crates

How to use

Recent Changes

  • 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 GuardScopeGuard

    • 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!()

No runtime deps