macro_rules! declare {
($ty:ty {
id: $id:expr,
version: $version:expr,
policy: $policy:expr,
response: $response:ty
$(, input: $input:ty)?
$(, output: $output:ty)?
$(, description: $description:expr)?
$(, visibility: $visibility:expr)?
$(, replay: $replay:expr)?
$(, grpc: ($package:expr, $service:expr, $method:expr))?
$(, grant: $grant:expr)?
$(, key: $key:expr)?
$(,)?
}) => { ... };
(@direction) => { ... };
(@direction $item:ty) => { ... };
}