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
) => { ... };
}