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),* } )?
    ) => { ... };
}