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

// fidl_experiment = output_index_json

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

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

namespace fidl {
namespace internal {

::test_requestflexibleenvelope::ProtocolRequestStrictResponseFlexibleRequest WireNaturalConversionTraits<::test_requestflexibleenvelope::wire::ProtocolRequestStrictResponseFlexibleRequest, ::test_requestflexibleenvelope::ProtocolRequestStrictResponseFlexibleRequest>::ToNatural(::test_requestflexibleenvelope::wire::ProtocolRequestStrictResponseFlexibleRequest src) {
  return ::test_requestflexibleenvelope::ProtocolRequestStrictResponseFlexibleRequest(WireNaturalConversionTraits<::test_requestflexibleenvelope::wire::StrictFoo, ::test_requestflexibleenvelope::StrictFoo>::ToNatural(std::move(src.s)));
}
::test_requestflexibleenvelope::wire::ProtocolRequestStrictResponseFlexibleRequest WireNaturalConversionTraits<::test_requestflexibleenvelope::wire::ProtocolRequestStrictResponseFlexibleRequest, ::test_requestflexibleenvelope::ProtocolRequestStrictResponseFlexibleRequest>::ToWire(fidl::AnyArena& arena, ::test_requestflexibleenvelope::ProtocolRequestStrictResponseFlexibleRequest src) {
  return ::test_requestflexibleenvelope::wire::ProtocolRequestStrictResponseFlexibleRequest{
      .s = WireNaturalConversionTraits<::test_requestflexibleenvelope::wire::StrictFoo, ::test_requestflexibleenvelope::StrictFoo>::ToWire(arena, std::move(src.s())),
  };
}

::test_requestflexibleenvelope::ProtocolRequestStrictResponseFlexibleResponse WireNaturalConversionTraits<::test_requestflexibleenvelope::wire::ProtocolRequestStrictResponseFlexibleResponse, ::test_requestflexibleenvelope::ProtocolRequestStrictResponseFlexibleResponse>::ToNatural(::test_requestflexibleenvelope::wire::ProtocolRequestStrictResponseFlexibleResponse src) {
  return ::test_requestflexibleenvelope::ProtocolRequestStrictResponseFlexibleResponse(WireNaturalConversionTraits<::test_requestflexibleenvelope::wire::FlexibleFoo, ::test_requestflexibleenvelope::FlexibleFoo>::ToNatural(std::move(src.f)));
}
::test_requestflexibleenvelope::wire::ProtocolRequestStrictResponseFlexibleResponse WireNaturalConversionTraits<::test_requestflexibleenvelope::wire::ProtocolRequestStrictResponseFlexibleResponse, ::test_requestflexibleenvelope::ProtocolRequestStrictResponseFlexibleResponse>::ToWire(fidl::AnyArena& arena, ::test_requestflexibleenvelope::ProtocolRequestStrictResponseFlexibleResponse src) {
  return ::test_requestflexibleenvelope::wire::ProtocolRequestStrictResponseFlexibleResponse{
      .f = WireNaturalConversionTraits<::test_requestflexibleenvelope::wire::FlexibleFoo, ::test_requestflexibleenvelope::FlexibleFoo>::ToWire(arena, std::move(src.f())),
  };
}

::test_requestflexibleenvelope::ProtocolRequestFlexibleResponseStrictRequest WireNaturalConversionTraits<::test_requestflexibleenvelope::wire::ProtocolRequestFlexibleResponseStrictRequest, ::test_requestflexibleenvelope::ProtocolRequestFlexibleResponseStrictRequest>::ToNatural(::test_requestflexibleenvelope::wire::ProtocolRequestFlexibleResponseStrictRequest src) {
  return ::test_requestflexibleenvelope::ProtocolRequestFlexibleResponseStrictRequest(WireNaturalConversionTraits<::test_requestflexibleenvelope::wire::FlexibleFoo, ::test_requestflexibleenvelope::FlexibleFoo>::ToNatural(std::move(src.s)));
}
::test_requestflexibleenvelope::wire::ProtocolRequestFlexibleResponseStrictRequest WireNaturalConversionTraits<::test_requestflexibleenvelope::wire::ProtocolRequestFlexibleResponseStrictRequest, ::test_requestflexibleenvelope::ProtocolRequestFlexibleResponseStrictRequest>::ToWire(fidl::AnyArena& arena, ::test_requestflexibleenvelope::ProtocolRequestFlexibleResponseStrictRequest src) {
  return ::test_requestflexibleenvelope::wire::ProtocolRequestFlexibleResponseStrictRequest{
      .s = WireNaturalConversionTraits<::test_requestflexibleenvelope::wire::FlexibleFoo, ::test_requestflexibleenvelope::FlexibleFoo>::ToWire(arena, std::move(src.s())),
  };
}

::test_requestflexibleenvelope::ProtocolRequestFlexibleResponseStrictResponse WireNaturalConversionTraits<::test_requestflexibleenvelope::wire::ProtocolRequestFlexibleResponseStrictResponse, ::test_requestflexibleenvelope::ProtocolRequestFlexibleResponseStrictResponse>::ToNatural(::test_requestflexibleenvelope::wire::ProtocolRequestFlexibleResponseStrictResponse src) {
  return ::test_requestflexibleenvelope::ProtocolRequestFlexibleResponseStrictResponse(WireNaturalConversionTraits<::test_requestflexibleenvelope::wire::StrictFoo, ::test_requestflexibleenvelope::StrictFoo>::ToNatural(std::move(src.f)));
}
::test_requestflexibleenvelope::wire::ProtocolRequestFlexibleResponseStrictResponse WireNaturalConversionTraits<::test_requestflexibleenvelope::wire::ProtocolRequestFlexibleResponseStrictResponse, ::test_requestflexibleenvelope::ProtocolRequestFlexibleResponseStrictResponse>::ToWire(fidl::AnyArena& arena, ::test_requestflexibleenvelope::ProtocolRequestFlexibleResponseStrictResponse src) {
  return ::test_requestflexibleenvelope::wire::ProtocolRequestFlexibleResponseStrictResponse{
      .f = WireNaturalConversionTraits<::test_requestflexibleenvelope::wire::StrictFoo, ::test_requestflexibleenvelope::StrictFoo>::ToWire(arena, std::move(src.f())),
  };
}

::test_requestflexibleenvelope::FlexibleFoo WireNaturalConversionTraits<::test_requestflexibleenvelope::wire::FlexibleFoo, ::test_requestflexibleenvelope::FlexibleFoo>::ToNatural(::test_requestflexibleenvelope::wire::FlexibleFoo src) {
  switch (src.Which()) {
    case ::test_requestflexibleenvelope::wire::FlexibleFoo::Tag::kS:
      return ::test_requestflexibleenvelope::FlexibleFoo::WithS(
          WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToNatural(std::move(src.s())));
    case ::test_requestflexibleenvelope::wire::FlexibleFoo::Tag::kI:
      return ::test_requestflexibleenvelope::FlexibleFoo::WithI(
          WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.i())));
    default:
      return ::test_requestflexibleenvelope::FlexibleFoo(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_requestflexibleenvelope::wire::FlexibleFoo WireNaturalConversionTraits<::test_requestflexibleenvelope::wire::FlexibleFoo, ::test_requestflexibleenvelope::FlexibleFoo>::ToWire(fidl::AnyArena& arena, ::test_requestflexibleenvelope::FlexibleFoo src) {
  switch (src.Which()) {
    case ::test_requestflexibleenvelope::FlexibleFoo::Tag::kS:
      return ::test_requestflexibleenvelope::wire::FlexibleFoo::WithS(arena,
                                                                      WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToWire(arena, std::move(src.s().value())));
    case ::test_requestflexibleenvelope::FlexibleFoo::Tag::kI:
      return ::test_requestflexibleenvelope::wire::FlexibleFoo::WithI(
          WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.i().value())));
    default:
      return ::test_requestflexibleenvelope::wire::FlexibleFoo();
  }
}

::test_requestflexibleenvelope::StrictFoo WireNaturalConversionTraits<::test_requestflexibleenvelope::wire::StrictFoo, ::test_requestflexibleenvelope::StrictFoo>::ToNatural(::test_requestflexibleenvelope::wire::StrictFoo src) {
  switch (src.Which()) {
    case ::test_requestflexibleenvelope::wire::StrictFoo::Tag::kS:
      return ::test_requestflexibleenvelope::StrictFoo::WithS(
          WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToNatural(std::move(src.s())));
    case ::test_requestflexibleenvelope::wire::StrictFoo::Tag::kI:
      return ::test_requestflexibleenvelope::StrictFoo::WithI(
          WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.i())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_requestflexibleenvelope::wire::StrictFoo WireNaturalConversionTraits<::test_requestflexibleenvelope::wire::StrictFoo, ::test_requestflexibleenvelope::StrictFoo>::ToWire(fidl::AnyArena& arena, ::test_requestflexibleenvelope::StrictFoo src) {
  switch (src.Which()) {
    case ::test_requestflexibleenvelope::StrictFoo::Tag::kS:
      return ::test_requestflexibleenvelope::wire::StrictFoo::WithS(arena,
                                                                    WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToWire(arena, std::move(src.s().value())));
    case ::test_requestflexibleenvelope::StrictFoo::Tag::kI:
      return ::test_requestflexibleenvelope::wire::StrictFoo::WithI(
          WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.i().value())));
  }
}

#ifdef __Fuchsia__

::fidl::Response<::test_requestflexibleenvelope::Protocol::RequestStrictResponseFlexible> WireNaturalConversionTraits<::fidl::WireResponse<::test_requestflexibleenvelope::Protocol::RequestStrictResponseFlexible>, ::fidl::Response<::test_requestflexibleenvelope::Protocol::RequestStrictResponseFlexible>>::ToNatural(::fidl::WireResponse<::test_requestflexibleenvelope::Protocol::RequestStrictResponseFlexible> src) {
  return ::fidl::Response<::test_requestflexibleenvelope::Protocol::RequestStrictResponseFlexible>(
      WireNaturalConversionTraits<::test_requestflexibleenvelope::wire::ProtocolRequestStrictResponseFlexibleResponse, ::test_requestflexibleenvelope::ProtocolRequestStrictResponseFlexibleResponse>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_requestflexibleenvelope::Protocol::RequestStrictResponseFlexible> WireNaturalConversionTraits<::fidl::WireResponse<::test_requestflexibleenvelope::Protocol::RequestStrictResponseFlexible>, ::fidl::Response<::test_requestflexibleenvelope::Protocol::RequestStrictResponseFlexible>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_requestflexibleenvelope::Protocol::RequestStrictResponseFlexible> src) {
  return ::fidl::WireResponse<::test_requestflexibleenvelope::Protocol::RequestStrictResponseFlexible>(
      WireNaturalConversionTraits<::test_requestflexibleenvelope::wire::ProtocolRequestStrictResponseFlexibleResponse, ::test_requestflexibleenvelope::ProtocolRequestStrictResponseFlexibleResponse>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_requestflexibleenvelope::Protocol::RequestFlexibleResponseStrict> WireNaturalConversionTraits<::fidl::WireResponse<::test_requestflexibleenvelope::Protocol::RequestFlexibleResponseStrict>, ::fidl::Response<::test_requestflexibleenvelope::Protocol::RequestFlexibleResponseStrict>>::ToNatural(::fidl::WireResponse<::test_requestflexibleenvelope::Protocol::RequestFlexibleResponseStrict> src) {
  return ::fidl::Response<::test_requestflexibleenvelope::Protocol::RequestFlexibleResponseStrict>(
      WireNaturalConversionTraits<::test_requestflexibleenvelope::wire::ProtocolRequestFlexibleResponseStrictResponse, ::test_requestflexibleenvelope::ProtocolRequestFlexibleResponseStrictResponse>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_requestflexibleenvelope::Protocol::RequestFlexibleResponseStrict> WireNaturalConversionTraits<::fidl::WireResponse<::test_requestflexibleenvelope::Protocol::RequestFlexibleResponseStrict>, ::fidl::Response<::test_requestflexibleenvelope::Protocol::RequestFlexibleResponseStrict>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_requestflexibleenvelope::Protocol::RequestFlexibleResponseStrict> src) {
  return ::fidl::WireResponse<::test_requestflexibleenvelope::Protocol::RequestFlexibleResponseStrict>(
      WireNaturalConversionTraits<::test_requestflexibleenvelope::wire::ProtocolRequestFlexibleResponseStrictResponse, ::test_requestflexibleenvelope::ProtocolRequestFlexibleResponseStrictResponse>::ToWire(arena, std::move(src)));
}

#endif  // __Fuchsia__
#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
