macro_rules! device {
(
#[device(identifier = $identifier:literal)]
$(#[$doc:meta])*
$vis:vis struct $device_name:ident;
$(
impl $trait_name:ident {
$(
#[device(invoke = $invoke_name:literal)]
fn $fn_name:ident $(<$($generic:ident),+ $(,)?>)? (&self $(, $($param_name:ident : $param_ty:ty),* $(,)?)?) $(-> $ret_ty:ty)?;
)+
}
)+
) => { ... };
}