destructure

Macro destructure 

Source
macro_rules! destructure {
    (let $S:path { $($field_spec:tt)* } = $value:expr) => { ... };
    (let ($($var:pat_param),* $(,)?) = $value:expr) => { ... };
    (@struct ()
        => let $S:path { $($field:ident: $var:pat_param),* } = $value:expr
    ) => { ... };
    (@struct ($next_field:ident: $next_var:pat_param $(,)?)
        => let $S:path { $($field:ident: $var:pat_param),* } = $value:expr
    ) => { ... };
    (@struct ($next_field:ident $(,)?)
        => let $S:path { $($field:ident: $var:pat_param),* } = $value:expr
    ) => { ... };
    (@struct ($next_field:ident: $next_var:pat_param, $($rest:tt)*)
        => let $S:path { $($field:ident: $var:pat_param),* } = $value:expr
    ) => { ... };
    (@struct ($next_field:ident, $($rest:tt)*)
        => let $S:path { $($field:ident: $var:pat_param),* } = $value:expr
    ) => { ... };
    (@tuple (); ($($index_rest:tt),*)
        => ($($ty:tt),*); let ($($index:tt: $var:pat_param),*) = $value:expr
    ) => { ... };
    (@tuple ($var_head:pat_param $(,$var_tail:pat_param)*); ()
        => ($($ty:tt),*); let ($($index:tt: $var:pat_param),*) = $value:expr
    ) => { ... };
    (@tuple ($var_head:pat_param $(,$var_tail:pat_param)*); ($index_head:tt $(,$index_tail:tt)*)
        => ($($ty:tt),*); let ($($index:tt: $var:pat_param),*) = $value:expr
    ) => { ... };
}