macro_rules! define_invocation { ( blueprint_name: $blueprint_name: ident, function_name: $function_name: ident, input: struct { $($input_ident: ident: $input_type: ty),* }, output: struct { $($output_ident: ident: $output_type: ty),* } $(,manifest_input: struct { $($manifest_input_ident: ident: $manifest_input_type: ty),* } )? ) => { ... }; ( blueprint_name: $blueprint_name: ident, function_name: $function_name: ident, input: struct { $($input_ident: ident: $input_type: ty),* }, output: type $output_type:ty $(,manifest_input: struct { $($manifest_input_ident: ident: $manifest_input_type: ty),* } )? ) => { ... }; ( blueprint_name: $blueprint_name: ident, function_name: $function_name: ident, input: type $input_type:ty, output: struct { $($output_ident: ident: $output_type: ty),* } $(,manifest_input: struct { $($manifest_input_ident: ident: $manifest_input_type: ty),* } )? ) => { ... }; ( blueprint_name: $blueprint_name: ident, function_name: $function_name: ident, input: type $input_type:ty, output: type $output_type:ty $(,manifest_input: struct { $($manifest_input_ident: ident: $manifest_input_type: ty),* } )? ) => { ... }; }