macro_rules! component {
(
$name:ident, $( contracts( $( $contract:ident ),* ) )*
inputs($( $input_field_name:ident: $input_contract_name:ident),* ),
inputs_array($( $input_array_name:ident: $input_contract_array:ident),* ),
outputs($( $output_field_name:ident: $output_contract_name:ident),* ),
outputs_array($($output_array_name:ident: $output_contract_array:ident),* ),
option($($option_contract: ident),*),
acc($($acc_contract: ident),*), $( portal($portal_type:ty => $portal_value:expr))*
fn run(&mut $arg:ident) -> Result<()> $fun:block
) => { ... };
}