#pragma once

#include <app-common/zap-generated/cluster-id.h>
#include <app-common/zap-generated/attribute-id.h>
#include <app/data-model/Nullable.h>

#include <string>
#include <vector>

namespace clusters {

{% for struct in structs %}
struct {{struct.name}}
{
  CHIP_ERROR Decode(chip::TLV::TLVReader & reader)
  {
    chip::app::Clusters::detail::Structs::{{struct.name}}::DecodableType t;
    CHIP_ERROR err = t.Decode(reader);
    if(err == CHIP_NO_ERROR) {
      {%-      for field in struct.fields %}
      {{field.name}} = t.{{field.name}};
      {%-      endfor  %}
    }
    return err;
  }

  CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const
  {
    chip::app::Clusters::detail::Structs::{{struct.name}}::Type t;
    {%-      for field in struct.fields %}
    t.{{field.name}} = {{field.name}};
    {%-      endfor  %}
    return t.Encode(writer, tag);
  }

  {%-   for field in struct.fields %}
  {{field | getField(None, idl)}} {{field.name}};
  {%-  endfor  %}
};
{%- endfor %}

}
