MCPcopy Index your code
hub / github.com/bluss/scopeguard

github.com/bluss/scopeguard @v1.2.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release v1.2.0 ↗ · + Follow
26 symbols 38 edges 2 files 2 documented · 8%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

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.

Minimum supported Rust version: 1.20

build_status crates

How to use

#[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 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!

Extension points exported contracts — how you extend this code

Strategy (Interface)
Controls in which cases the associated code should be run [3 implementers]
src/lib.rs

Core symbols most depended-on inside this repo

guard
called by 7
src/lib.rs
guard_on_unwind
called by 1
src/lib.rs
f
called by 1
examples/readme.rs
g
called by 1
examples/readme.rs
should_run
called by 0
src/lib.rs
with_strategy
called by 0
src/lib.rs
into_inner
called by 0
src/lib.rs
guard_on_success
called by 0
src/lib.rs

Shape

Function 14
Method 7
Enum 3
Class 1
Interface 1

Languages

Rust100%

Modules by API surface

src/lib.rs23 symbols
examples/readme.rs3 symbols

For agents

$ claude mcp add scopeguard \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact