{{/*
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
*/}}

{{- define "ProtocolForwardDeclaration/DomainObjects" }}
{{ EnsureNamespace . }}
{{- IfdefFuchsia -}}
{{- .Docs }}
class {{ .Name }};
using {{ .Name }}Handle = ::fidl::InterfaceHandle<{{ .Name }}>;
{{- EndifFuchsia -}}
{{- end }}

{{- define "PointerParams" -}}
  {{- range $index, $param := . -}}
    , {{ $param.Type }}* {{ $param.Name }}
  {{- end -}}
{{ end }}

{{- define "ProtocolDeclaration/DomainObjects" }}
{{ EnsureNamespace . }}
{{- IfdefFuchsia -}}

{{- range .Methods }}
  {{ EnsureCodingTableDecl .Request.HlCodingTable }}
{{- end }}

{{ EnsureNamespace .RequestEncoder }}
class {{ .RequestEncoder.Name }} {
 public:
  {{- with $protocol := . }}
  {{- range .Methods }}
  {{- if .HasRequest }}
  static ::fidl::HLCPPOutgoingMessage {{ .Name }}(::fidl::MessageEncoder* _encoder{{ template "PointerParams" .RequestArgs }}) {
    {{- if .HasRequestPayload }}
    fidl_trace(WillHLCPPEncode);
    _encoder->Alloc({{ .Request.TypeShapeV2.InlineSize }});

    {{- range .RequestArgs }}
    {{- if .HandleInformation }}
    ::fidl::Encode(_encoder, {{ .Name }}, {{ .OffsetV2 }} + sizeof(fidl_message_header_t), ::fidl::HandleInformation {
      .object_type = {{ .HandleInformation.ObjectType }},
      .rights = {{ .HandleInformation.Rights }},
    });
    {{ else }}
    ::fidl::Encode(_encoder, {{ .Name }}, {{ .OffsetV2 }} + sizeof(fidl_message_header_t));
    {{ end -}}
    {{- end }}

    fidl_trace(DidHLCPPEncode, &{{ .Request.HlCodingTable }}, _encoder->GetPtr<const char>(0), _encoder->CurrentLength(), _encoder->CurrentHandleCount());
    {{- end }}

    return _encoder->GetMessage();
  }
  {{- end }}
  {{- end }}
  {{- end }}
};

{{- range .Methods }}
  {{ EnsureCodingTableDecl .Response.HlCodingTable }}
{{- end }}

{{ EnsureNamespace .ResponseEncoder }}
class {{ .ResponseEncoder.Name }} {
 public:
  {{- with $protocol := . }}
  {{- range .Methods }}
  {{- if .HasResponse }}
  static ::fidl::HLCPPOutgoingMessage {{ .Name }}(::fidl::MessageEncoder* _encoder{{ template "PointerParams" .ResponseArgs }}) {
    {{- if .HasResponsePayload }}
    fidl_trace(WillHLCPPEncode);

    _encoder->Alloc({{ .Response.TypeShapeV2.InlineSize }});

    {{- range .ResponseArgs }}
    {{- if .HandleInformation }}
    ::fidl::Encode(_encoder, {{ .Name }}, {{ .OffsetV2 }} + sizeof(fidl_message_header_t), ::fidl::HandleInformation {
      .object_type = {{ .HandleInformation.ObjectType }},
      .rights = {{ .HandleInformation.Rights }},
    });
    {{ else }}
    ::fidl::Encode(_encoder, {{ .Name }}, {{ .OffsetV2 }} + sizeof(fidl_message_header_t));
    {{ end -}}
    {{- end }}

    fidl_trace(DidHLCPPEncode, &{{ .Response.HlCodingTable }}, _encoder->GetPtr<const char>(0), _encoder->CurrentLength(), _encoder->CurrentHandleCount());
    {{- end }}

    return _encoder->GetMessage();
  }
  {{- end }}
  {{- end }}
  {{- end }}
};

{{- EndifFuchsia -}}
{{- end }}
