clonelicious/
macro.rs

1/// A helper macro to clone variables into closures or async blocks easily.
2///
3/// This macro supports several usage patterns:
4///
5/// - Clone variables into an `async move` block.
6/// - Clone variables into a regular block.
7/// - Clone variables into an `async move` closure with or without explicit `move`.
8/// - Clone variables into a regular closure with or without explicit `move`.
9#[macro_export]
10macro_rules! clone {
11    ( $( $var:ident ),* => async move $body:block ) => {{
12        $( let $var = $var.clone(); )*
13        async move $body
14    }};
15
16    ( $( $var:ident ),* => $body:block ) => {{
17        $( let $var = $var.clone(); )*
18        $body
19    }};
20
21    ( $( $var:ident ),* => move |$( $arg:ident $(: $ty:ty)? ),*| async move $body:block ) => {{
22        $( let $var = $var.clone(); )*
23        move |$( $arg $(: $ty)? ),*| {
24            $( let $var = $var.clone(); )*
25            async move $body
26        }
27    }};
28
29    ( $( $var:ident ),* => |$( $arg:ident $(: $ty:ty)? ),*| async move $body:block ) => {{
30        $( let $var = $var.clone(); )*
31        move |$( $arg $(: $ty)? ),*| {
32            $( let $var = $var.clone(); )*
33            async move $body
34        }
35    }};
36
37    ( $( $var:ident ),* => move |$( $arg:ident $(: $ty:ty)? ),*| $body:block ) => {{
38        $( let $var = $var.clone(); )*
39        move |$( $arg $(: $ty)? ),*| {
40            $( let $var = $var.clone(); )*
41            $body
42        }
43    }};
44
45    ( $( $var:ident ),* => |$( $arg:ident $(: $ty:ty)? ),*| $body:block ) => {{
46        $( let $var = $var.clone(); )*
47        move |$( $arg $(: $ty)? ),*| {
48            $( let $var = $var.clone(); )*
49            $body
50        }
51    }};
52}