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

// fidl_experiment = output_index_json

#pragma once

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

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

namespace fidl {
namespace internal {

template <>
struct NaturalToHLCPPTraits<::test_transitivedependencies::Baz> {
  using HLCPPType = ::test::transitivedependencies::Baz;
  static inline ::test::transitivedependencies::Baz Convert(::test_transitivedependencies::Baz&&);
};
template <>
struct HLCPPToNaturalTraits<::test::transitivedependencies::Baz> {
  using NaturalType = ::test_transitivedependencies::Baz;
  static inline ::test_transitivedependencies::Baz Convert(::test::transitivedependencies::Baz&&);
};

::test::transitivedependencies::Baz NaturalToHLCPPTraits<::test_transitivedependencies::Baz>::Convert(::test_transitivedependencies::Baz&& value) {
  ::test::transitivedependencies::Baz hlcpp;
  hlcpp.g = ::fidl::NaturalToHLCPP(std::move(value.g()));
  return hlcpp;
}

::test_transitivedependencies::Baz HLCPPToNaturalTraits<::test::transitivedependencies::Baz>::Convert(::test::transitivedependencies::Baz&& value) {
  return ::test_transitivedependencies::Baz{{
      .g = ::fidl::HLCPPToNatural(std::move(value.g)),
  }};
}

#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
