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