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

// fidl_experiment = output_index_json

#pragma once

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

#endif  // __Fuchsia__
#include <fidl/test.errorsyntax.parent/cpp/type_conversions.h>
#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_errorsyntax::wire::ExampleUseOfErrorSyntaxCallWhichMayFailRequest, ::test_errorsyntax::ExampleUseOfErrorSyntaxCallWhichMayFailRequest> {
  static ::test_errorsyntax::ExampleUseOfErrorSyntaxCallWhichMayFailRequest ToNatural(::test_errorsyntax::wire::ExampleUseOfErrorSyntaxCallWhichMayFailRequest src);
  static ::test_errorsyntax::wire::ExampleUseOfErrorSyntaxCallWhichMayFailRequest ToWire(fidl::AnyArena& arena, ::test_errorsyntax::ExampleUseOfErrorSyntaxCallWhichMayFailRequest src);
};

template <>
struct NaturalTypeForWireType<::test_errorsyntax::wire::ExampleUseOfErrorSyntaxCallWhichMayFailRequest> {
  using type = ::test_errorsyntax::ExampleUseOfErrorSyntaxCallWhichMayFailRequest;
};
template <>
struct WireTypeForNaturalType<::test_errorsyntax::ExampleUseOfErrorSyntaxCallWhichMayFailRequest> {
  using type = ::test_errorsyntax::wire::ExampleUseOfErrorSyntaxCallWhichMayFailRequest;
};

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

template <>
struct NaturalTypeForWireType<::test_errorsyntax::wire::ExampleUseOfErrorSyntaxCallWhichMayFailResponse> {
  using type = ::test_errorsyntax::ExampleUseOfErrorSyntaxCallWhichMayFailResponse;
};
template <>
struct WireTypeForNaturalType<::test_errorsyntax::ExampleUseOfErrorSyntaxCallWhichMayFailResponse> {
  using type = ::test_errorsyntax::wire::ExampleUseOfErrorSyntaxCallWhichMayFailResponse;
};

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

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

template <>
struct NaturalTypeForWireType<::test_errorsyntax::wire::ExampleUseOfErrorSyntaxCallWhichMayFailResult> {
  using type = ::test_errorsyntax::ExampleUseOfErrorSyntaxCallWhichMayFailResult;
};
template <>
struct WireTypeForNaturalType<::test_errorsyntax::ExampleUseOfErrorSyntaxCallWhichMayFailResult> {
  using type = ::test_errorsyntax::wire::ExampleUseOfErrorSyntaxCallWhichMayFailResult;
};

#ifdef __Fuchsia__

template <>
struct WireNaturalConversionTraits<::fidl::WireResponse<::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>, ::fidl::Response<::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>> {
  static ::fidl::Response<::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail> ToNatural(::fidl::WireResponse<::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail> src);
  static ::fidl::WireResponse<::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail> ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail> src);
};

template <>
struct NaturalTypeForWireType<::fidl::WireResponse<::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>> {
  using type = ::fidl::Response<::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>;
};
template <>
struct WireTypeForNaturalType<::fidl::Response<::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>> {
  using type = ::fidl::WireResponse<::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>;
};

template <>
struct WireNaturalConversionTraits<::fidl::WireResponse<::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>, ::fidl::Response<::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>> {
  static ::fidl::Response<::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail> ToNatural(::fidl::WireResponse<::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail> src);
  static ::fidl::WireResponse<::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail> ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail> src);
};

template <>
struct NaturalTypeForWireType<::fidl::WireResponse<::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>> {
  using type = ::fidl::Response<::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>;
};
template <>
struct WireTypeForNaturalType<::fidl::Response<::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>> {
  using type = ::fidl::WireResponse<::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>;
};

#endif  // __Fuchsia__
#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
