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

#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>

namespace fidl {
namespace internal {

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::ExampleFooTopResponse,
                                   ::test_error::ExampleFooTopResponse> {
  static ::test_error::ExampleFooTopResponse ToNatural(
      ::test_error::wire::ExampleFooTopResponse src);
  static ::test_error::wire::ExampleFooTopResponse ToWire(
      fidl::AnyArena& arena, ::test_error::ExampleFooTopResponse src);
};

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

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::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<
    ::test_error::wire::ExampleFooResult,
    std::unique_ptr<::test_error::ExampleFooResult>> {
  static std::unique_ptr<::test_error::ExampleFooResult> ToNatural(
      ::test_error::wire::ExampleFooResult src);
  static ::test_error::wire::ExampleFooResult ToWire(
      fidl::AnyArena& arena,
      std::unique_ptr<::test_error::ExampleFooResult> src);
};

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

#ifdef __Fuchsia__

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

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

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__
}  // namespace internal
}  // namespace fidl
