{{> header}}

#include <commands/clusters/ComplexArgument.h>

{{#structs_with_clusters groupByStructName=1}}
CHIP_ERROR ComplexArgumentParser::Setup(const char * label, chip::app::Clusters::{{#unless (is_number_greater_than structClusterCount 1)}}{{as_camel_cased clusterName false}}{{else}}detail{{/unless}}::Structs::{{name}}::Type & request, Json::Value & value)
{
    VerifyOrReturnError(value.isObject(), CHIP_ERROR_INVALID_ARGUMENT);

    {{#zcl_struct_items}}
    {{#unless isOptional}}
    {{~! Fabric index fields are not sent on writes, so don't force people to
      provide them. ~}}
    {{#unless (is_num_equal fieldIdentifier 254)}}
    ReturnErrorOnFailure(ComplexArgumentParser::EnsureMemberExist("{{parent.name}}.{{asLowerCamelCase label}}", "{{asLowerCamelCase label}}", value.isMember("{{asLowerCamelCase label}}")));
    {{/unless}}
    {{/unless}}
    {{/zcl_struct_items}}

    char labelWithMember[kMaxLabelLength];
    {{#zcl_struct_items}}
    {{#if isOptional}}
    if (value.isMember("{{asLowerCamelCase label}}"))
    {
    {{else if (is_num_equal fieldIdentifier 254)}}
    if (value.isMember("{{asLowerCamelCase label}}"))
    {
    {{/if}}
    snprintf(labelWithMember, sizeof(labelWithMember), "%s.%s", label, "{{asLowerCamelCase label}}");
    ReturnErrorOnFailure(ComplexArgumentParser::Setup(labelWithMember, request.{{asLowerCamelCase label}}, value["{{asLowerCamelCase label}}"]));
    {{#if isOptional}}
    }
    {{else if (is_num_equal fieldIdentifier 254)}}
    }
    {{/if}}

    {{/zcl_struct_items}}
    return CHIP_NO_ERROR;
}

void ComplexArgumentParser::Finalize(chip::app::Clusters::{{#unless (is_number_greater_than structClusterCount 1)}}{{as_camel_cased clusterName false}}{{else}}detail{{/unless}}::Structs::{{name}}::Type & request)
{
    {{#zcl_struct_items}}
    ComplexArgumentParser::Finalize(request.{{asLowerCamelCase label}});
    {{/zcl_struct_items}}
}
{{/structs_with_clusters}}

