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

// fidl_experiment = output_index_json

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

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

namespace fidl {
namespace internal {

::test_error::ExampleFooRequest WireNaturalConversionTraits<::test_error::wire::ExampleFooRequest, ::test_error::ExampleFooRequest>::ToNatural(::test_error::wire::ExampleFooRequest src) {
  return ::test_error::ExampleFooRequest(WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToNatural(std::move(src.s)));
}
::test_error::wire::ExampleFooRequest WireNaturalConversionTraits<::test_error::wire::ExampleFooRequest, ::test_error::ExampleFooRequest>::ToWire(fidl::AnyArena& arena, ::test_error::ExampleFooRequest src) {
  return ::test_error::wire::ExampleFooRequest{
      .s = WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToWire(arena, std::move(src.s())),
  };
}

::test_error::ExampleFooResponse WireNaturalConversionTraits<::test_error::wire::ExampleFooResponse, ::test_error::ExampleFooResponse>::ToNatural(::test_error::wire::ExampleFooResponse src) {
  return ::test_error::ExampleFooResponse(WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.y)));
}
::test_error::wire::ExampleFooResponse WireNaturalConversionTraits<::test_error::wire::ExampleFooResponse, ::test_error::ExampleFooResponse>::ToWire(fidl::AnyArena& arena, ::test_error::ExampleFooResponse src) {
  return ::test_error::wire::ExampleFooResponse{
      .y = WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.y())),
  };
}

::test_error::ExampleFooResult WireNaturalConversionTraits<::test_error::wire::ExampleFooResult, ::test_error::ExampleFooResult>::ToNatural(::test_error::wire::ExampleFooResult src) {
  switch (src.Which()) {
    case ::test_error::wire::ExampleFooResult::Tag::kResponse:
      return ::test_error::ExampleFooResult::WithResponse(
          WireNaturalConversionTraits<::test_error::wire::ExampleFooResponse, ::test_error::ExampleFooResponse>::ToNatural(std::move(src.response())));
    case ::test_error::wire::ExampleFooResult::Tag::kErr:
      return ::test_error::ExampleFooResult::WithErr(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_error::wire::ExampleFooResult WireNaturalConversionTraits<::test_error::wire::ExampleFooResult, ::test_error::ExampleFooResult>::ToWire(fidl::AnyArena& arena, ::test_error::ExampleFooResult src) {
  switch (src.Which()) {
    case ::test_error::ExampleFooResult::Tag::kResponse:
      return ::test_error::wire::ExampleFooResult::WithResponse(arena,
                                                                WireNaturalConversionTraits<::test_error::wire::ExampleFooResponse, ::test_error::ExampleFooResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_error::ExampleFooResult::Tag::kErr:
      return ::test_error::wire::ExampleFooResult::WithErr(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.err().value())));
  }
}

#ifdef __Fuchsia__

::fidl::Response<::test_error::Example::Foo> WireNaturalConversionTraits<::fidl::WireResponse<::test_error::Example::Foo>, ::fidl::Response<::test_error::Example::Foo>>::ToNatural(::fidl::WireResponse<::test_error::Example::Foo> src) {
  return ::fidl::Response<::test_error::Example::Foo>(
      WireNaturalConversionTraits<::test_error::wire::ExampleFooResult, ::fit::result<uint32_t, ::test_error::ExampleFooResponse>>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_error::Example::Foo> WireNaturalConversionTraits<::fidl::WireResponse<::test_error::Example::Foo>, ::fidl::Response<::test_error::Example::Foo>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_error::Example::Foo> src) {
  return ::fidl::WireResponse<::test_error::Example::Foo>(
      WireNaturalConversionTraits<::test_error::wire::ExampleFooResult, ::fit::result<uint32_t, ::test_error::ExampleFooResponse>>::ToWire(arena, std::move(src)));
}

#endif  // __Fuchsia__
#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
