{{> header excludeZapComment=true}}

#import "MTRAttributeTLVValueDecoder_Internal.h"

#import "MTRStructsObjc.h"

#include <app/data-model/Decode.h>
#include <app/data-model/DecodableList.h>
#include <app-common/zap-generated/cluster-objects.h>
#include <app-common/zap-generated/ids/Attributes.h>
#include <app-common/zap-generated/ids/Clusters.h>
#include <lib/support/TypeTraits.h>

using namespace chip;
using namespace chip::app;

{{#zcl_clusters}}
{{#if (isSupported (asUpperCamelCase name preserveAcronyms=true))}}
static id _Nullable DecodeAttributeValueFor{{asUpperCamelCase name preserveAcronyms=true}}Cluster(AttributeId aAttributeId, TLV::TLVReader & aReader, CHIP_ERROR * aError)
{
    using namespace Clusters::{{asUpperCamelCase name}};
    switch (aAttributeId) {
        {{#zcl_attributes_server removeKeys='isOptional'}}
        {{#if (isSupported (asUpperCamelCase ../name preserveAcronyms=true) attribute=(asUpperCamelCase name preserveAcronyms=true))}}
        case Attributes::{{asUpperCamelCase name}}::Id: {
            using TypeInfo = Attributes::{{asUpperCamelCase name}}::TypeInfo;
            TypeInfo::DecodableType cppValue;
            *aError = DataModel::Decode(aReader, cppValue);
            if (*aError != CHIP_NO_ERROR)
            {
                return nil;
            }
            {{asObjectiveCType type parent.name}} value;
            {{>decode_value target="value" source="cppValue" cluster=parent.name errorCode="*aError = err; return nil;" depth=0}}
            return value;
        }
        {{/if}}
        {{/zcl_attributes_server}}
        default: {
            break;
        }
    }

    *aError = CHIP_ERROR_IM_MALFORMED_ATTRIBUTE_PATH_IB;
    return nil;
}
{{/if}}
{{/zcl_clusters}}

id _Nullable MTRDecodeAttributeValue(const ConcreteAttributePath & aPath, TLV::TLVReader & aReader, CHIP_ERROR * aError)
{
    switch (aPath.mClusterId) {
        {{#zcl_clusters}}
        {{#if (isSupported (asUpperCamelCase name preserveAcronyms=true))}}
        case Clusters::{{asUpperCamelCase name}}::Id: {
            return DecodeAttributeValueFor{{asUpperCamelCase name preserveAcronyms=true}}Cluster(aPath.mAttributeId, aReader, aError);
        }
        {{/if}}
        {{/zcl_clusters}}
        default: {
            break;
        }
    }
    *aError = CHIP_ERROR_IM_MALFORMED_ATTRIBUTE_PATH_IB;
    return nil;
}
