#guard #panic

no-std scope-guard

Simple RAII scope guard

3 stable releases

1.2.0 Mar 11, 2023
1.1.0 Sep 9, 2022
1.0.0 Mar 3, 2021

#196 in No standard library

Download history 27/week @ 2023-07-29 23/week @ 2023-08-05 113/week @ 2023-08-12 130/week @ 2023-08-19 72/week @ 2023-08-26 71/week @ 2023-09-02 95/week @ 2023-09-09 48/week @ 2023-09-16 107/week @ 2023-09-23 59/week @ 2023-09-30 57/week @ 2023-10-07 107/week @ 2023-10-14 48/week @ 2023-10-21 129/week @ 2023-10-28 89/week @ 2023-11-04 78/week @ 2023-11-11

352 downloads per month

BSL-1.0 license

10KB
129 lines

scope-guard

Rust Crates.io Documentation

Simple RAII scope guard

Features

  • std - Enables async scope to run destructor when future finishes, even if it panics.

lib.rs:

Simple RAII scope guard

Usage:

No argument guard

use scope_guard::scope_guard;

let mut is_run = false;
{
     scope_guard!(|| {
         is_run = true;
     });
}
assert!(is_run);

Single argument guard

use scope_guard::scope_guard;

fn do_stuff(val: &mut u32)  {
    let old_val = *val;
    let mut val = scope_guard!(|val| {
        *val = old_val;
    }, val);

    **val += 1; //Double * to deref &mut u32

    let is_ok = false;//doing some computations
    if is_ok {
        val.forget();
    }
}

let mut val = 0;
do_stuff(&mut val);
assert_eq!(val, 0);

let mut guard = scope_guard!(|val| {
    *val = 1;
}, &mut val);
drop(guard);
assert_eq!(val, 1);

Stacked destructor calls

use scope_guard::scope_guard;

fn do_stuff(val: &mut u32)  {
    let old_value = *val;
    let val = scope_guard!(|val| {
        assert_eq!(*val, old_value);
        //Do nothing
    }, val);

    let mut val = val.stack(|val| {
        **val = old_value;
    });

    **val += 1; //Double * to deref &mut u32
}

let mut val = 0;
do_stuff(&mut val);
assert_eq!(val, 0);

Multiple argument guard

use scope_guard::scope_guard;

fn do_stuff(val: &mut u32, is_run: &mut bool)  {
    let old_val = *val;
    let mut guard = scope_guard!(|(val, is_run)| {
        *val = old_val;
        *is_run = false;
    }, val, is_run);

    *guard.0 += 1;
    *guard.1 = true;

    let is_ok = false; //doing some computations
    if is_ok {
        let (_val, _is_run) = guard.into_inner(); //analogues to forget
    }
}

let mut is_run = false;
let mut val = 0;
do_stuff(&mut val, &mut is_run);
assert_eq!(val, 0);
assert!(!is_run);

let mut guard = scope_guard!(|(val, is_run)| {
    *val = 1;
    *is_run = true;
}, &mut val, &mut is_run);

drop(guard);
assert_eq!(val, 1);
assert!(is_run);

No runtime deps

Features