{{> header excludeZapComment=true}}

#import "MTRStructsObjc.h"

NS_ASSUME_NONNULL_BEGIN

{{#zcl_clusters}}
{{#zcl_structs}}
@implementation MTR{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase name preserveAcronyms=true}}
- (instancetype)init
{
  if (self = [super init]) {
    {{#zcl_struct_items}}
    {{>init_struct_member label=label type=type cluster=parent.parent.name}}
    {{/zcl_struct_items}}
  }
  return self;
}

- (id)copyWithZone:(NSZone * _Nullable)zone
{
  auto other = [[MTR{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase name preserveAcronyms=true}} alloc] init];

  {{#zcl_struct_items}}
  other.{{asStructPropertyName label}} = self.{{asStructPropertyName label}};
  {{/zcl_struct_items}}

  return other;
}

- (NSString *)description
{
  NSString *descriptionString = [NSString stringWithFormat:@"<%@: {{#zcl_struct_items}}{{asStructPropertyName label}}:%@; {{/zcl_struct_items}}>", NSStringFromClass([self class]){{#zcl_struct_items}},{{#if isArray}}_{{asStructPropertyName label}}{{else if (isOctetString type)}}[_{{asStructPropertyName label}} base64EncodedStringWithOptions:0]{{else}}_{{asStructPropertyName label}}{{/if}}{{/zcl_struct_items}}];
  return descriptionString;
}

@end

{{/zcl_structs}}

{{#zcl_events}}
@implementation MTR{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase name preserveAcronyms=true}}Event
- (instancetype)init
{
  if (self = [super init]) {
    {{#zcl_event_fields}}
    {{>init_struct_member label=name type=type cluster=parent.parent.name}}
    {{/zcl_event_fields}}
  }
  return self;
}

- (id)copyWithZone:(NSZone * _Nullable)zone
{
  auto other = [[MTR{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase name preserveAcronyms=true}}Event alloc] init];

  {{#zcl_event_fields}}
  other.{{asStructPropertyName name}} = self.{{asStructPropertyName name}};
  {{/zcl_event_fields}}

  return other;
}

- (NSString *)description
{
  NSString *descriptionString = [NSString stringWithFormat:@"<%@: {{#zcl_event_fields}}{{asStructPropertyName name}}:%@; {{/zcl_event_fields}}>", NSStringFromClass([self class]){{#zcl_event_fields}},{{#if isArray}}_{{asStructPropertyName name}}{{else if (isOctetString type)}}[_{{asStructPropertyName name}} base64EncodedStringWithOptions:0]{{else}}_{{asStructPropertyName name}}{{/if}}{{/zcl_event_fields}}];
  return descriptionString;
}

@end

{{/zcl_events}}

{{/zcl_clusters}}

NS_ASSUME_NONNULL_END
