
/// AUTO-GENERATED with matter_idl.

syntax = "proto3";

package {{package}};

option java_multiple_files = true;

message {{cluster.name}}Cluster {
  // option (message_type) = MATTER_TRAIT;

  enum ClusterId {
    CLUSTER_ID_UNSUPPORTED = 0;
    CLUSTER_ID = {{cluster.code}};
  }
{%- if cluster.enums %}

  // Enums
{%-   for entry in cluster.enums %}
  enum {{entry.name}} {
    {%- if (entry.entries[0].code != 0) %}
    {{"unsupported" | toEnumEntryName(entry.name)}} = 0;{% endif -%}
    {%-  for field in entry.entries %}
    {{field.name | toEnumEntryName(entry.name)}} = {{field.code}};{%   endfor %}
  }
{%   endfor %}{% endif -%}
{%- if cluster.bitmaps %}

  // Bitmaps
{%-   for entry in cluster.bitmaps %}
  enum {{entry.name}} {
    {{"unsupported" | toEnumEntryName(entry.name)}} = 0;
    {%-  for field in entry.entries %}
    {{field.name | toEnumEntryName(entry.name)}} = {{field.code}};{%   endfor %}
  }
{%   endfor %}{% endif -%}
{%- if cluster.structs %}

  // Structs
{%-   for entry in cluster.structs %}{% if not entry.tag %}
  message {{entry.name}} {
    {%-  for field in entry.fields %}
    {{field | toFieldComment}}
    {{field | toProtobufFullType}} {{field.name | toLowerSnakeCase}} = {{field | toFieldTag}};{%   endfor %}
  }
{% endif %}{%   endfor %}{% endif -%}
{%- if cluster.attributes %}

  // Attributes
{%-   for attr in cluster.attributes %}
  {{attr.definition | toFieldComment}}
  {{attr.definition.data_type.name | toProtobufType}} {{attr.definition.name | toLowerSnakeCase}} = {{attr.definition | toFieldTag()}};
    /*
    [(attribute) = {
{%- if attr.is_writable %}
      is_writable : true,{% endif %}
{%- if attr.is_subscribable %}
      is_subscribable: true,{% endif %}
    }];
    */

{%   endfor %}{% endif -%}
{%- if cluster.commands %}

  // Commands
{%-   for cmd in cluster.commands %}
  message {{cmd.name}}Command {
    // option (message_type) = MATTER_COMMAND;
    {% if cmd.input_param %}{%-  for field in cmd | commandArgs(cluster) %}
    {{field | toFieldComment}}
    {{field | toProtobufFullType}} {{field.name | toLowerSnakeCase}} = {{field | toFieldTag}};{%   endfor %}{% endif %}
  }{% if cmd.output_param != "DefaultSuccess" %}
  
  message {{cmd.name}}CommandResponse {
    // option (message_type) = MATTER_COMMAND_RESPONSE;
    {% if cmd.output_param %}{%-  for field in cmd | commandResponseArgs(cluster) %}
    {{field | toFieldComment}}
    {{field | toProtobufFullType}} {{field.name | toLowerSnakeCase}} = {{field | toFieldTag}};{%   endfor %}{% endif %}
  }{% endif %}
{%   endfor %}{% endif %}

{%- if cluster.events %}
  // Events
{%-   for entry in cluster.events %}
  message {{entry.name}} {
    // option (message_type) = MATTER_EVENT;
    {%  for field in entry.fields %}
    {{field | toFieldComment}}
    {{field | toProtobufFullType}} {{field.name | toLowerSnakeCase}} = {{field | toFieldTag}};{%   endfor %}
  }

{%   endfor %}{% endif %}
} // {{cluster.name}}Cluster
