#pragma once

#include <app/data-model/Nullable.h>
#include <lib/assign/ValueAssign.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 %}
      chip::Value::Assign({{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 %}
      chip::Value::Assign(t.{{field.name}},  {{field.name}});
      {%- endfor  %}
    return t.Encode(writer, tag);
  }

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

}
