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

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

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::ProtocolRequestFlexibleResponseStrictTopResponse
WireNaturalConversionTraits<
    ::test_requestflexibleenvelope::wire::
        ProtocolRequestFlexibleResponseStrictTopResponse,
    ::test_requestflexibleenvelope::
        ProtocolRequestFlexibleResponseStrictTopResponse>::
    ToNatural(::test_requestflexibleenvelope::wire::
                  ProtocolRequestFlexibleResponseStrictTopResponse src) {
  return ::test_requestflexibleenvelope::
      ProtocolRequestFlexibleResponseStrictTopResponse(
          WireNaturalConversionTraits<
              ::test_requestflexibleenvelope::wire::StrictFoo,
              ::test_requestflexibleenvelope::StrictFoo>::
              ToNatural(std::move(src.f)));
}
::test_requestflexibleenvelope::wire::
    ProtocolRequestFlexibleResponseStrictTopResponse
    WireNaturalConversionTraits<
        ::test_requestflexibleenvelope::wire::
            ProtocolRequestFlexibleResponseStrictTopResponse,
        ::test_requestflexibleenvelope::
            ProtocolRequestFlexibleResponseStrictTopResponse>::
        ToWire(fidl::AnyArena& arena,
               ::test_requestflexibleenvelope::
                   ProtocolRequestFlexibleResponseStrictTopResponse src) {
  return ::test_requestflexibleenvelope::wire::
      ProtocolRequestFlexibleResponseStrictTopResponse{
          .f = WireNaturalConversionTraits<
              ::test_requestflexibleenvelope::wire::StrictFoo,
              ::test_requestflexibleenvelope::StrictFoo>::ToWire(arena,
                                                                 std::move(
                                                                     src.f())),
      };
}

::test_requestflexibleenvelope::ProtocolRequestStrictResponseFlexibleTopResponse
WireNaturalConversionTraits<
    ::test_requestflexibleenvelope::wire::
        ProtocolRequestStrictResponseFlexibleTopResponse,
    ::test_requestflexibleenvelope::
        ProtocolRequestStrictResponseFlexibleTopResponse>::
    ToNatural(::test_requestflexibleenvelope::wire::
                  ProtocolRequestStrictResponseFlexibleTopResponse src) {
  return ::test_requestflexibleenvelope::
      ProtocolRequestStrictResponseFlexibleTopResponse(
          WireNaturalConversionTraits<
              ::test_requestflexibleenvelope::wire::FlexibleFoo,
              ::test_requestflexibleenvelope::FlexibleFoo>::
              ToNatural(std::move(src.f)));
}
::test_requestflexibleenvelope::wire::
    ProtocolRequestStrictResponseFlexibleTopResponse
    WireNaturalConversionTraits<
        ::test_requestflexibleenvelope::wire::
            ProtocolRequestStrictResponseFlexibleTopResponse,
        ::test_requestflexibleenvelope::
            ProtocolRequestStrictResponseFlexibleTopResponse>::
        ToWire(fidl::AnyArena& arena,
               ::test_requestflexibleenvelope::
                   ProtocolRequestStrictResponseFlexibleTopResponse src) {
  return ::test_requestflexibleenvelope::wire::
      ProtocolRequestStrictResponseFlexibleTopResponse{
          .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::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())));
  }
}

std::unique_ptr<::test_requestflexibleenvelope::StrictFoo>
WireNaturalConversionTraits<
    ::test_requestflexibleenvelope::wire::StrictFoo,
    std::unique_ptr<::test_requestflexibleenvelope::StrictFoo>>::
    ToNatural(::test_requestflexibleenvelope::wire::StrictFoo src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<::test_requestflexibleenvelope::StrictFoo>(
      WireNaturalConversionTraits<
          ::test_requestflexibleenvelope::wire::StrictFoo,
          ::test_requestflexibleenvelope::StrictFoo>::
          ToNatural(std::move(src)));
}
::test_requestflexibleenvelope::wire::StrictFoo WireNaturalConversionTraits<
    ::test_requestflexibleenvelope::wire::StrictFoo,
    std::unique_ptr<::test_requestflexibleenvelope::StrictFoo>>::
    ToWire(fidl::AnyArena& arena,
           std::unique_ptr<::test_requestflexibleenvelope::StrictFoo> src) {
  if (!src) {
    return ::test_requestflexibleenvelope::wire::StrictFoo();
  }
  return WireNaturalConversionTraits<
      ::test_requestflexibleenvelope::wire::StrictFoo,
      ::test_requestflexibleenvelope::StrictFoo>::ToWire(arena,
                                                         std::move(*src));
}

::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();
  }
}
::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();
  }
}

std::unique_ptr<::test_requestflexibleenvelope::FlexibleFoo>
WireNaturalConversionTraits<
    ::test_requestflexibleenvelope::wire::FlexibleFoo,
    std::unique_ptr<::test_requestflexibleenvelope::FlexibleFoo>>::
    ToNatural(::test_requestflexibleenvelope::wire::FlexibleFoo src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<::test_requestflexibleenvelope::FlexibleFoo>(
      WireNaturalConversionTraits<
          ::test_requestflexibleenvelope::wire::FlexibleFoo,
          ::test_requestflexibleenvelope::FlexibleFoo>::
          ToNatural(std::move(src)));
}
::test_requestflexibleenvelope::wire::FlexibleFoo WireNaturalConversionTraits<
    ::test_requestflexibleenvelope::wire::FlexibleFoo,
    std::unique_ptr<::test_requestflexibleenvelope::FlexibleFoo>>::
    ToWire(fidl::AnyArena& arena,
           std::unique_ptr<::test_requestflexibleenvelope::FlexibleFoo> src) {
  if (!src) {
    return ::test_requestflexibleenvelope::wire::FlexibleFoo();
  }
  return WireNaturalConversionTraits<
      ::test_requestflexibleenvelope::wire::FlexibleFoo,
      ::test_requestflexibleenvelope::FlexibleFoo>::ToWire(arena,
                                                           std::move(*src));
}

#ifdef __Fuchsia__

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

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

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