macro_rules! enum_dispatch {
(@match $self:ident $fnc:ident $combined_args:tt [$($variant:ident),+]) => { ... };
($vis:vis$(,)? $fnc:ident, $self:ty, [$($arg:ident: $t:ty),*], $ret:ty, [$($variant:ident),+]) => { ... };
($variants:tt $(fnc!($vis:vis$(,)? $fnc:ident, $self:ty, $args:tt, $ret:ty);)+) => { ... };
}