#capture #struct #macro

captur

Macro to capture whole structs from disjoint fields in a closure

3 releases (stable)

new 1.0.1 Jul 21, 2024
1.0.0 Jun 30, 2024
0.1.0 Jul 1, 2021

#448 in Rust patterns

Download history 91/week @ 2024-04-01 30/week @ 2024-04-08 16/week @ 2024-04-15 43/week @ 2024-04-22 38/week @ 2024-04-29 46/week @ 2024-05-06 22/week @ 2024-05-13 31/week @ 2024-05-20 68/week @ 2024-05-27 625/week @ 2024-06-03 150/week @ 2024-06-10 62/week @ 2024-06-17 274/week @ 2024-06-24 134/week @ 2024-07-01 32/week @ 2024-07-08 218/week @ 2024-07-15

663 downloads per month
Used in 4 crates

ISC license

11KB

Crates.io docs GitHub license

Captur

Starting in Rust 2021, Rust will no longer capture whole structs and instead will only capture a disjoint set of the fields used in a closure. In some cases, it is necessary to capture the structs to retain a particular drop order. This macro will capture the struct within the closure, ensuring the correct drop order.

The Fix

The typical fix to this problem is to create an unused reference to the struct.

let some_struct = SomeStruct::new();
let result = || {
    // capture some_struct within the closure
    let _ = &some_struct;
    println!("{}", some_struct.y);
}

While this is trivial to implement in closures where capturing is required, without a comment, the meaning of the unused line is difficult to determine. This macro provides a self documenting and potentially more concise way to capture the structs.

Installation and Usage

[dependencies]
captur = "1"
use captur::capture;

fn send_event_and_action(action: &Action, event: Event) {
    send(|sender| {
        capture!(action, event);
        sender.send(action.name.as_str(), event.code);
    });
}

Supported Rust Versions

This project will support Rust versions since 1.56.0, the first release of Rust 2021.

Dropping support for a Rust version will result in a major version bump, following Semantic Versioning.

License

Captur is released under the ISC license. See LICENSE.

No runtime deps