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

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

namespace fidl {
namespace internal {

#ifdef __Fuchsia__

::fidl::Request<::test_foreigntypeinresponseusedthroughcompose::Top::GetFoo>
WireNaturalConversionTraits<
    ::fidl::WireRequest<
        ::test_foreigntypeinresponseusedthroughcompose::Top::GetFoo>,
    ::fidl::Request<
        ::test_foreigntypeinresponseusedthroughcompose::Top::GetFoo>>::
    ToNatural(::fidl::WireRequest<
              ::test_foreigntypeinresponseusedthroughcompose::Top::GetFoo>
                  src) {
  return ::fidl::Request<
      ::test_foreigntypeinresponseusedthroughcompose::Top::GetFoo>();
}
::fidl::WireRequest<::test_foreigntypeinresponseusedthroughcompose::Top::GetFoo>
WireNaturalConversionTraits<
    ::fidl::WireRequest<
        ::test_foreigntypeinresponseusedthroughcompose::Top::GetFoo>,
    ::fidl::Request<
        ::test_foreigntypeinresponseusedthroughcompose::Top::GetFoo>>::
    ToWire(fidl::AnyArena& arena,
           ::fidl::Request<
               ::test_foreigntypeinresponseusedthroughcompose::Top::GetFoo>
               src) {
  return ::fidl::WireRequest<
      ::test_foreigntypeinresponseusedthroughcompose::Top::GetFoo>();
}

::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::MiddleGetFooTopResponse,
          ::test_middle::MiddleGetFooTopResponse>::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::MiddleGetFooTopResponse,
          ::test_middle::MiddleGetFooTopResponse>::ToWire(arena,
                                                          std::move(src)));
}
#endif  // __Fuchsia__
}  // namespace internal
}  // namespace fidl
