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

// fidl_experiment = output_index_json

#include <fidl/test.foreigntypeinresponseusedthroughcompose/cpp/type_conversions.h>

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

namespace fidl {
namespace internal {

#ifdef __Fuchsia__

::fidl::Response<::test_foreigntypeinresponseusedthroughcompose::Top::GetFoo> WireNaturalConversionTraits<::fidl::WireResponse<::test_foreigntypeinresponseusedthroughcompose::Top::GetFoo>, ::fidl::Response<::test_foreigntypeinresponseusedthroughcompose::Top::GetFoo>>::ToNatural(::fidl::WireResponse<::test_foreigntypeinresponseusedthroughcompose::Top::GetFoo> src) {
  return ::fidl::Response<::test_foreigntypeinresponseusedthroughcompose::Top::GetFoo>(
      WireNaturalConversionTraits<::test_middle::wire::MiddleGetFooResponse, ::test_middle::MiddleGetFooResponse>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_foreigntypeinresponseusedthroughcompose::Top::GetFoo> WireNaturalConversionTraits<::fidl::WireResponse<::test_foreigntypeinresponseusedthroughcompose::Top::GetFoo>, ::fidl::Response<::test_foreigntypeinresponseusedthroughcompose::Top::GetFoo>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_foreigntypeinresponseusedthroughcompose::Top::GetFoo> src) {
  return ::fidl::WireResponse<::test_foreigntypeinresponseusedthroughcompose::Top::GetFoo>(
      WireNaturalConversionTraits<::test_middle::wire::MiddleGetFooResponse, ::test_middle::MiddleGetFooResponse>::ToWire(arena, std::move(src)));
}

#endif  // __Fuchsia__
#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
