// WARNING: This file is machine generated by fidlgen.

// fidl_experiment = output_index_json

#pragma once

#include <fidl/test.bottom/cpp/hlcpp_conversion.h>
#include <fidl/test.middle/cpp/hlcpp_conversion.h>
#include <fidl/test.transitivedependenciescompose/cpp/natural_types.h>
#include <lib/fidl/cpp/hlcpp_conversion.h>
#include <lib/fidl/cpp/wire/service_handler.h>
#include <test/transitivedependenciescompose/cpp/fidl.h>

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

namespace fidl {
namespace internal {

template <>
struct NaturalToHLCPPTraits<fidl::ClientEnd<::test_transitivedependenciescompose::Top>> {
  using HLCPPType = fidl::InterfaceHandle<::test::transitivedependenciescompose::Top>;
  static inline fidl::InterfaceHandle<::test::transitivedependenciescompose::Top> Convert(fidl::ClientEnd<::test_transitivedependenciescompose::Top>&& c) {
    return fidl::InterfaceHandle<::test::transitivedependenciescompose::Top>(c.TakeChannel());
  }
};

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

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

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

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

template <>
struct HLCPPToNaturalTraits<fidl::InterfaceRequestHandler<::test::transitivedependenciescompose::Top>> {
  using NaturalType = fidl::ProtocolHandler<::test_transitivedependenciescompose::Top>;
  static inline fidl::ProtocolHandler<::test_transitivedependenciescompose::Top> Convert(fidl::InterfaceRequestHandler<::test::transitivedependenciescompose::Top>&& c) {
    return [c = std::move(c)](fidl::ServerEnd<::test_transitivedependenciescompose::Top> r) {
      c(::fidl::NaturalToHLCPP(r));
    };
  }
};

#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
