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

// fidl_experiment = output_index_json

#pragma once

#include <fidl/test.error/cpp/markers.h>
#include <fidl/test.error/cpp/natural_types.h>
#include <fidl/test.error/cpp/wire_types.h>
#ifdef __Fuchsia__
#include <fidl/test.error/cpp/natural_messaging.h>
#include <fidl/test.error/cpp/wire_messaging.h>

#endif  // __Fuchsia__
#include <lib/fidl/cpp/wire_natural_conversions.h>

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

namespace fidl {
namespace internal {

template <>
struct WireNaturalConversionTraits<::test_error::wire::ExampleFooRequest, ::test_error::ExampleFooRequest> {
  static ::test_error::ExampleFooRequest ToNatural(::test_error::wire::ExampleFooRequest src);
  static ::test_error::wire::ExampleFooRequest ToWire(fidl::AnyArena& arena, ::test_error::ExampleFooRequest src);
};

template <>
struct NaturalTypeForWireType<::test_error::wire::ExampleFooRequest> {
  using type = ::test_error::ExampleFooRequest;
};
template <>
struct WireTypeForNaturalType<::test_error::ExampleFooRequest> {
  using type = ::test_error::wire::ExampleFooRequest;
};

template <>
struct WireNaturalConversionTraits<::test_error::wire::ExampleFooResponse, ::test_error::ExampleFooResponse> {
  static ::test_error::ExampleFooResponse ToNatural(::test_error::wire::ExampleFooResponse src);
  static ::test_error::wire::ExampleFooResponse ToWire(fidl::AnyArena& arena, ::test_error::ExampleFooResponse src);
};

template <>
struct NaturalTypeForWireType<::test_error::wire::ExampleFooResponse> {
  using type = ::test_error::ExampleFooResponse;
};
template <>
struct WireTypeForNaturalType<::test_error::ExampleFooResponse> {
  using type = ::test_error::wire::ExampleFooResponse;
};

template <>
struct WireNaturalConversionTraits<::test_error::wire::ExampleFooResult, ::test_error::ExampleFooResult> {
  static ::test_error::ExampleFooResult ToNatural(::test_error::wire::ExampleFooResult src);
  static ::test_error::wire::ExampleFooResult ToWire(fidl::AnyArena& arena, ::test_error::ExampleFooResult src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_error::wire::ExampleFooResult>, std::unique_ptr<::test_error::ExampleFooResult>> {
  static std::unique_ptr<::test_error::ExampleFooResult> ToNatural(::fidl::WireOptional<::test_error::wire::ExampleFooResult> src);
  static ::fidl::WireOptional<::test_error::wire::ExampleFooResult> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_error::ExampleFooResult> src);
};

template <>
struct NaturalTypeForWireType<::test_error::wire::ExampleFooResult> {
  using type = ::test_error::ExampleFooResult;
};
template <>
struct WireTypeForNaturalType<::test_error::ExampleFooResult> {
  using type = ::test_error::wire::ExampleFooResult;
};

#ifdef __Fuchsia__

template <>
struct WireNaturalConversionTraits<::fidl::WireResponse<::test_error::Example::Foo>, ::fidl::Response<::test_error::Example::Foo>> {
  static ::fidl::Response<::test_error::Example::Foo> ToNatural(::fidl::WireResponse<::test_error::Example::Foo> src);
  static ::fidl::WireResponse<::test_error::Example::Foo> ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_error::Example::Foo> src);
};

template <>
struct NaturalTypeForWireType<::fidl::WireResponse<::test_error::Example::Foo>> {
  using type = ::fidl::Response<::test_error::Example::Foo>;
};
template <>
struct WireTypeForNaturalType<::fidl::Response<::test_error::Example::Foo>> {
  using type = ::fidl::WireResponse<::test_error::Example::Foo>;
};

#endif  // __Fuchsia__
#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
