{{> header}}

#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;

id MTRDecodeAttributeValue(const ConcreteAttributePath & aPath, TLV::TLVReader & aReader, CHIP_ERROR * aError)
{
    switch (aPath.mClusterId)
    {
    {{#chip_client_clusters includeAll=true}}
    case Clusters::{{asUpperCamelCase name}}::Id: {
        using namespace Clusters::{{asUpperCamelCase name}};
        switch (aPath.mAttributeId)
        {
        {{#chip_server_cluster_attributes}}
        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;
        }
        {{/chip_server_cluster_attributes}}
        default:
          *aError = CHIP_ERROR_IM_MALFORMED_ATTRIBUTE_PATH_IB;
          break;
        }
        break;
    }
    {{/chip_client_clusters}}
    default: {
      *aError = CHIP_ERROR_IM_MALFORMED_ATTRIBUTE_PATH_IB;
      break;
    }
    }
    return nil;
}
