macro_rules! extern_rust {
(@enum $enum_name:ident $(, $name:tt [ $( $attr:meta ),* ] )* ) => { ... };
(@handle-ret $vm:ident, u8, $value:ident) => { ... };
(@handle-ret $vm:ident, u16, $value:ident) => { ... };
(@handle-ret $vm:ident, u32, $value:ident) => { ... };
(@handle-ret $vm:ident, u64, $value:ident) => { ... };
(@handle-ret $vm:ident, i8, $value:ident) => { ... };
(@handle-ret $vm:ident, i16, $value:ident) => { ... };
(@handle-ret $vm:ident, i32, $value:ident) => { ... };
(@handle-ret $vm:ident, i64, $value:ident) => { ... };
(@handle-ret $vm:ident, f32, $value:ident) => { ... };
(@handle-ret $vm:ident, f64, $value:ident) => { ... };
(@handle-ret $vm:ident, bool, $value:ident) => { ... };
(@handle-ret $vm:ident, $_:tt, $value:ident) => { ... };
(@handle-param $vm:ident, u8) => { ... };
(@handle-param $vm:ident, u16) => { ... };
(@handle-param $vm:ident, u32) => { ... };
(@handle-param $vm:ident, u64) => { ... };
(@handle-param $vm:ident, i8) => { ... };
(@handle-param $vm:ident, i16) => { ... };
(@handle-param $vm:ident, i32) => { ... };
(@handle-param $vm:ident, i64) => { ... };
(@handle-param $vm:ident, f32) => { ... };
(@handle-param $vm:ident, f64) => { ... };
(@handle-param $vm:ident, bool) => { ... };
(@handle-param $vm:ident, & str) => { ... };
(@handle-param $vm:ident, & $_:tt) => { ... };
(@handle-param $vm:ident, $_:tt) => { ... };
(@trait $enum_name:ident, $custom_type:ty $(, $name:tt, $vm:ident [ $( $arg_name:ident : $($arg_type:tt)+ ),* ] [ $($ret_type:ident)? ] $code:block )* ) => { ... };
(
$enum_name:ident, $custom_type:ty, { $(
$( #[ $attr:meta ] )*
fn $name:tt ( $vm:ident : & mut VM $(, $arg_name:ident : $($arg_type:tt)+ )* ) $( -> $ret_type:ident )? $code:block
)* }
) => { ... };
}