macro_rules! mk {
(struct $state:ident<$($glts:lifetime),*> {$($field:ident : {$($lts:lifetime),*} $field_type:ty),*$(,)?}) => { ... };
(@$state:ident {$($acc:tt)*} $fields:tt {
$field:ident : $lts:tt $field_type:tt
$(,$($rest:tt)*)?
}) => { ... };
(@$state:ident $body:tt $fields:tt {$(,)?}) => { ... };
(@@$state:ident {$({$($fields:tt)*} $field:ident : {$($lts:lifetime)*} {$($field_type:tt)+},)*}) => { ... };
}