macro_rules! stream_handler {
    (
		async fn $name:ident( $($ptt:tt)* ) $($tt:tt)*
	) => { ... };
    (
		async fn $name:ident<$data_ty:ty>(
			$req:ident: $req_ty:ty,
			$stream:ident
		) $($tt:tt)*
	) => { ... };
    (
		async fn $name:ident<$data_ty:ty>(
			$req:ident: $req_ty:ty,
			$stream:ident,
			$($data:ident),*
		) -> $ret_ty:ty $block:block
	) => { ... };
}
Expand description
stream_handler! {
	async fn name(req: Request, stream, any_data) -> Result<(), Error> {
		// if the request was StreamKind::Sender use
		// stream.recv()
		// else if StreamKind::Receiver
		// stream.send(msg)
	}
}