{{/*
// Copyright 2022 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 "Filename:HLCPPConversion" -}}
  fidl/{{ .LibraryDots }}/cpp/hlcpp_conversion.h
{{- end }}


{{- define "Filename:HLCPPHeader" -}}
  {{ .LibrarySlashes }}/cpp/fidl.h
{{- end }}


{{- define "File:HLCPPConversion" -}}
  {{- UseWire -}}
  // WARNING: This file is machine generated by fidlgen.
  {{ range $experiment := .Experiments }}
  // fidl_experiment = {{ $experiment }}
  {{- end }}

  #pragma once

  #include <{{ .Library | Filename "NaturalTypesHeader" }}>
  #include <{{ .Library | Filename "HLCPPHeader" }}>

  #include <lib/fidl/cpp/wire/service_handler.h>
  #include <lib/fidl/cpp/hlcpp_conversion.h>

  {{ range .Dependencies -}}
    #include <{{ . | Filename "HLCPPConversion" }}>
  {{ end }}

  #pragma clang diagnostic push
  #pragma clang diagnostic ignored "-Wshadow"

  {{ EnsureNamespace "fidl::internal" }}

  {{- range .Enums }}
    template<>
    struct NaturalToHLCPPTraits<{{ .Unified }}> : public NaturalToHLCPPTraitsEnum<{{ .Unified }}, {{ .HLCPP }}, {{ .Type }}>{};
    template<>
    struct HLCPPToNaturalTraits<{{ .HLCPP }}> : public HLCPPToNaturalTraitsEnum<{{ .HLCPP }}, {{ .Unified }}>{};
  {{- end }}

  {{- range .Bits }}
    template<>
    struct NaturalToHLCPPTraits<{{ .Unified }}> : public NaturalToHLCPPTraitsBits<{{ .Unified }}, {{ .HLCPP }}, {{ .Type }}>{};
    template<>
    struct HLCPPToNaturalTraits<{{ .HLCPP }}> : public HLCPPToNaturalTraitsBits<{{ .HLCPP }}, {{ .Unified }}, {{ .Type }}>{};
  {{- end }}

  {{ range ( call .ProtocolsForTransport "Channel" ) }}
    template<>
    struct NaturalToHLCPPTraits<fidl::ClientEnd<{{ .Wire }}>> {
      using HLCPPType = fidl::InterfaceHandle<{{ .HLCPP }}>;
      static inline fidl::InterfaceHandle<{{ .HLCPP }}> Convert(fidl::ClientEnd<{{ .Wire }}>&& c) {
        return fidl::InterfaceHandle<{{ .HLCPP }}>(c.TakeChannel());
      }
    };

    template<>
    struct NaturalToHLCPPTraits<fidl::ServerEnd<{{ .Wire }}>> {
      using HLCPPType = fidl::InterfaceRequest<{{ .HLCPP }}>;
      static inline fidl::InterfaceRequest<{{ .HLCPP }}> Convert(fidl::ServerEnd<{{ .Wire }}>&& c) {
        return fidl::InterfaceRequest<{{ .HLCPP }}>(c.TakeChannel());
      }
    };

    template<>
    struct HLCPPToNaturalTraits<fidl::InterfaceHandle<{{ .HLCPP }}>> {
      using NaturalType = fidl::ClientEnd<{{ .Wire }}>;
      static inline fidl::ClientEnd<{{ .Wire }}> Convert(fidl::InterfaceHandle<{{ .HLCPP }}>&& c) {
        return fidl::ClientEnd<{{ .Wire }}>(c.TakeChannel());
      }
    };

    template<>
    struct HLCPPToNaturalTraits<fidl::InterfaceRequest<{{ .HLCPP }}>> {
      using NaturalType = fidl::ServerEnd<{{ .Wire }}>;
      static inline fidl::ServerEnd<{{ .Wire }}> Convert(fidl::InterfaceRequest<{{ .HLCPP }}>&& c) {
        return fidl::ServerEnd<{{ .Wire }}>(c.TakeChannel());
      }
    };

    template<>
    struct NaturalToHLCPPTraits<fidl::ProtocolHandler<{{ .Wire }}>> {
      using HLCPPType = fidl::InterfaceRequestHandler<{{ .HLCPP }}>;
      static inline fidl::InterfaceRequestHandler<{{ .HLCPP }}> Convert(fidl::ProtocolHandler<{{ .Wire }}>&& c) {
        return [c = std::move(c)](fidl::InterfaceRequest<{{ .HLCPP }}> r) {
          c(::fidl::HLCPPToNatural(r));
        };
      }
    };

    template<>
    struct HLCPPToNaturalTraits<fidl::InterfaceRequestHandler<{{ .HLCPP }}>> {
      using NaturalType = fidl::ProtocolHandler<{{ .Wire }}>;
      static inline fidl::ProtocolHandler<{{ .Wire }}> Convert(fidl::InterfaceRequestHandler<{{ .HLCPP }}>&& c) {
        return [c = std::move(c)](fidl::ServerEnd<{{ .Wire }}> r) {
          c(::fidl::NaturalToHLCPP(r));
        };
      }
    };
  {{- end }}

  {{ range .Structs }}
    template<>
    struct NaturalToHLCPPTraits<{{ .Unified }}> {
      using HLCPPType = {{ .HLCPP }};
      static inline {{ .HLCPP }} Convert({{ .Unified }}&&);
    };
    template<>
    struct HLCPPToNaturalTraits<{{ .HLCPP }}> {
      using NaturalType = {{ .Unified }};
      static inline {{ .Unified }} Convert({{ .HLCPP }}&&);
    };
  {{- end }}

  {{- range .Tables }}
    template<>
    struct NaturalToHLCPPTraits<{{ .Unified }}> {
      using HLCPPType = {{ .HLCPP }};
      static inline {{ .HLCPP }} Convert({{ .Unified }}&&);
    };
    template<>
    struct HLCPPToNaturalTraits<{{ .HLCPP }}> {
      using NaturalType = {{ .Unified }};
      static inline {{ .Unified }} Convert({{ .HLCPP }}&&);
    };
  {{- end }}

  {{- range .Unions }}
    template<>
    struct NaturalToHLCPPTraits<{{ .Unified }}> {
      using HLCPPType = {{ .HLCPP }};
      static inline {{ .HLCPP }} Convert({{ .Unified }}&&);
    };
    template<>
    struct HLCPPToNaturalTraits<{{ .HLCPP }}> {
      using NaturalType = {{ .Unified }};
      static inline {{ .Unified }} Convert({{ .HLCPP }}&&);
    };
  {{- end }}

  {{ range .Structs }}
    {{ .HLCPP }} NaturalToHLCPPTraits<{{ .Unified }}>::Convert({{ .Unified }}&& value) {
      {{ .HLCPP }} hlcpp;
      {{- range .Members }}
        hlcpp.{{ .HLCPP }} = ::fidl::NaturalToHLCPP(std::move(value.{{ .Unified }}()));
      {{- end }}
      return hlcpp;
    }

    {{ .Unified }} HLCPPToNaturalTraits<{{ .HLCPP }}>::Convert({{ .HLCPP }}&& value) {
      return {{ .Unified }}{ {
        {{- range .Members }}
          .{{ .Unified }} = ::fidl::HLCPPToNatural(std::move(value.{{ .HLCPP }})),
        {{- end }}
      } };
    }
  {{- end }}

  {{- range .Tables }}
    {{ .HLCPP }} NaturalToHLCPPTraits<{{ .Unified }}>::Convert({{ .Unified }}&& value) {
      {{ .HLCPP }} hlcpp;
      {{- range .Members }}
        if (value.{{ .Unified }}().has_value()) {
          hlcpp.set_{{ .HLCPP }}(::fidl::NaturalToHLCPP(std::move(value.{{ .Unified }}().value())));
        }
      {{- end }}
      return hlcpp;
    }

    {{ .Unified }} HLCPPToNaturalTraits<{{ .HLCPP }}>::Convert({{ .HLCPP }}&& value) {
      {{ .Unified }} natural;
      {{- range .Members }}
        if (value.{{ .MethodHasName }}()) {
          natural.{{ .Unified }}() = ::fidl::HLCPPToNatural(std::move(*value.mutable_{{ .HLCPP }}()));
        }
      {{- end }}
      return natural;
    }
  {{- end }}

  {{ range .Unions }}
    {{ .HLCPP }} NaturalToHLCPPTraits<{{ .Unified }}>::Convert({{ .Unified }}&& value) {
      {{ .HLCPP }} hlcpp;
      switch (value.Which()) {
        {{- range .Members }}
          case {{ .TagName.Unified }}:
            hlcpp.set_{{ .HLCPP }}(::fidl::NaturalToHLCPP(std::move(value.{{ .Unified }}().value())));
            break;
        {{- end }}
        default:
          break;
      }
      return hlcpp;
    }

    {{ .Unified }} HLCPPToNaturalTraits<{{ .HLCPP }}>::Convert({{ .HLCPP }}&& value) {
      using _NaturalUnion = {{ .Unified }};
      switch (value.Which()) {
        {{- range .Members }}
          case {{ .TagName.HLCPP }}:
            return _NaturalUnion::With{{ .UpperCamelCaseName }}(
                  ::fidl::HLCPPToNatural(std::move(value.{{ .HLCPP }}())));
        {{- end }}
          default:
        {{- if .IsFlexible }}
            return _NaturalUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
        {{- else }}
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "{{ .HLCPP }}");
        {{- end }}
      }
    }
  {{- end }}

  #pragma clang diagnostic pop

  {{ EndOfFile }}
{{ end }}
