macro_rules! match_parameters {
    ($ctx:ident, $args:ident, ($($name:ident),+): ($($type:path),+) => $cmd:expr, $($rest:tt)*) => { ... };
    (error, $ctx:ident, $data:ident, ) => { ... };
    (error, $ctx:ident, $data:ident, [$($expected:tt)*], $($rest:tt)*) => { ... };
    (impl, [$($expected:tt)*], $ctx:ident, $args:ident,) => { ... };
    (impl, [$($expected:tt)*], $ctx:ident, $args:ident, ($($name:ident),+): ($($type:path),+) => $cmd:expr, $($rest:tt)*) => { ... };
}