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

// fidl_experiment = output_index_json

#pragma once

#include <fidl/test.protocolpayloads.imported/cpp/hlcpp_conversion.h>
#include <fidl/test.protocolpayloads/cpp/natural_types.h>
#include <lib/fidl/cpp/hlcpp_conversion.h>
#include <lib/fidl/cpp/wire/service_handler.h>
#include <test/protocolpayloads/cpp/fidl.h>

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

namespace fidl {
namespace internal {

template <>
struct NaturalToHLCPPTraits<fidl::ClientEnd<::test_protocolpayloads::MainProtocol>> {
  using HLCPPType = fidl::InterfaceHandle<::test::protocolpayloads::MainProtocol>;
  static inline fidl::InterfaceHandle<::test::protocolpayloads::MainProtocol> Convert(fidl::ClientEnd<::test_protocolpayloads::MainProtocol>&& c) {
    return fidl::InterfaceHandle<::test::protocolpayloads::MainProtocol>(c.TakeChannel());
  }
};

template <>
struct NaturalToHLCPPTraits<fidl::ServerEnd<::test_protocolpayloads::MainProtocol>> {
  using HLCPPType = fidl::InterfaceRequest<::test::protocolpayloads::MainProtocol>;
  static inline fidl::InterfaceRequest<::test::protocolpayloads::MainProtocol> Convert(fidl::ServerEnd<::test_protocolpayloads::MainProtocol>&& c) {
    return fidl::InterfaceRequest<::test::protocolpayloads::MainProtocol>(c.TakeChannel());
  }
};

template <>
struct HLCPPToNaturalTraits<fidl::InterfaceHandle<::test::protocolpayloads::MainProtocol>> {
  using NaturalType = fidl::ClientEnd<::test_protocolpayloads::MainProtocol>;
  static inline fidl::ClientEnd<::test_protocolpayloads::MainProtocol> Convert(fidl::InterfaceHandle<::test::protocolpayloads::MainProtocol>&& c) {
    return fidl::ClientEnd<::test_protocolpayloads::MainProtocol>(c.TakeChannel());
  }
};

template <>
struct HLCPPToNaturalTraits<fidl::InterfaceRequest<::test::protocolpayloads::MainProtocol>> {
  using NaturalType = fidl::ServerEnd<::test_protocolpayloads::MainProtocol>;
  static inline fidl::ServerEnd<::test_protocolpayloads::MainProtocol> Convert(fidl::InterfaceRequest<::test::protocolpayloads::MainProtocol>&& c) {
    return fidl::ServerEnd<::test_protocolpayloads::MainProtocol>(c.TakeChannel());
  }
};

template <>
struct NaturalToHLCPPTraits<fidl::ProtocolHandler<::test_protocolpayloads::MainProtocol>> {
  using HLCPPType = fidl::InterfaceRequestHandler<::test::protocolpayloads::MainProtocol>;
  static inline fidl::InterfaceRequestHandler<::test::protocolpayloads::MainProtocol> Convert(fidl::ProtocolHandler<::test_protocolpayloads::MainProtocol>&& c) {
    return [c = std::move(c)](fidl::InterfaceRequest<::test::protocolpayloads::MainProtocol> r) {
      c(::fidl::HLCPPToNatural(r));
    };
  }
};

template <>
struct HLCPPToNaturalTraits<fidl::InterfaceRequestHandler<::test::protocolpayloads::MainProtocol>> {
  using NaturalType = fidl::ProtocolHandler<::test_protocolpayloads::MainProtocol>;
  static inline fidl::ProtocolHandler<::test_protocolpayloads::MainProtocol> Convert(fidl::InterfaceRequestHandler<::test::protocolpayloads::MainProtocol>&& c) {
    return [c = std::move(c)](fidl::ServerEnd<::test_protocolpayloads::MainProtocol> r) {
      c(::fidl::NaturalToHLCPP(r));
    };
  }
};

template <>
struct NaturalToHLCPPTraits<::test_protocolpayloads::LocalStructPayload> {
  using HLCPPType = ::test::protocolpayloads::LocalStructPayload;
  static inline ::test::protocolpayloads::LocalStructPayload Convert(::test_protocolpayloads::LocalStructPayload&&);
};
template <>
struct HLCPPToNaturalTraits<::test::protocolpayloads::LocalStructPayload> {
  using NaturalType = ::test_protocolpayloads::LocalStructPayload;
  static inline ::test_protocolpayloads::LocalStructPayload Convert(::test::protocolpayloads::LocalStructPayload&&);
};
template <>
struct NaturalToHLCPPTraits<::test_protocolpayloads::MainProtocolOneWayAnonRequest> {
  using HLCPPType = ::test::protocolpayloads::MainProtocolOneWayAnonRequest;
  static inline ::test::protocolpayloads::MainProtocolOneWayAnonRequest Convert(::test_protocolpayloads::MainProtocolOneWayAnonRequest&&);
};
template <>
struct HLCPPToNaturalTraits<::test::protocolpayloads::MainProtocolOneWayAnonRequest> {
  using NaturalType = ::test_protocolpayloads::MainProtocolOneWayAnonRequest;
  static inline ::test_protocolpayloads::MainProtocolOneWayAnonRequest Convert(::test::protocolpayloads::MainProtocolOneWayAnonRequest&&);
};
template <>
struct NaturalToHLCPPTraits<::test_protocolpayloads::MainProtocolTwoWayAnonRequest> {
  using HLCPPType = ::test::protocolpayloads::MainProtocolTwoWayAnonRequest;
  static inline ::test::protocolpayloads::MainProtocolTwoWayAnonRequest Convert(::test_protocolpayloads::MainProtocolTwoWayAnonRequest&&);
};
template <>
struct HLCPPToNaturalTraits<::test::protocolpayloads::MainProtocolTwoWayAnonRequest> {
  using NaturalType = ::test_protocolpayloads::MainProtocolTwoWayAnonRequest;
  static inline ::test_protocolpayloads::MainProtocolTwoWayAnonRequest Convert(::test::protocolpayloads::MainProtocolTwoWayAnonRequest&&);
};
template <>
struct NaturalToHLCPPTraits<::test_protocolpayloads::MainProtocolTwoWayAnonResponse> {
  using HLCPPType = ::test::protocolpayloads::MainProtocolTwoWayAnonResponse;
  static inline ::test::protocolpayloads::MainProtocolTwoWayAnonResponse Convert(::test_protocolpayloads::MainProtocolTwoWayAnonResponse&&);
};
template <>
struct HLCPPToNaturalTraits<::test::protocolpayloads::MainProtocolTwoWayAnonResponse> {
  using NaturalType = ::test_protocolpayloads::MainProtocolTwoWayAnonResponse;
  static inline ::test_protocolpayloads::MainProtocolTwoWayAnonResponse Convert(::test::protocolpayloads::MainProtocolTwoWayAnonResponse&&);
};
template <>
struct NaturalToHLCPPTraits<::test_protocolpayloads::MainProtocolTwoWayAnonWithErrorRequest> {
  using HLCPPType = ::test::protocolpayloads::MainProtocolTwoWayAnonWithErrorRequest;
  static inline ::test::protocolpayloads::MainProtocolTwoWayAnonWithErrorRequest Convert(::test_protocolpayloads::MainProtocolTwoWayAnonWithErrorRequest&&);
};
template <>
struct HLCPPToNaturalTraits<::test::protocolpayloads::MainProtocolTwoWayAnonWithErrorRequest> {
  using NaturalType = ::test_protocolpayloads::MainProtocolTwoWayAnonWithErrorRequest;
  static inline ::test_protocolpayloads::MainProtocolTwoWayAnonWithErrorRequest Convert(::test::protocolpayloads::MainProtocolTwoWayAnonWithErrorRequest&&);
};
template <>
struct NaturalToHLCPPTraits<::test_protocolpayloads::MainProtocolTwoWayAnonWithErrorResponse> {
  using HLCPPType = ::test::protocolpayloads::MainProtocol_TwoWayAnonWithError_Response;
  static inline ::test::protocolpayloads::MainProtocol_TwoWayAnonWithError_Response Convert(::test_protocolpayloads::MainProtocolTwoWayAnonWithErrorResponse&&);
};
template <>
struct HLCPPToNaturalTraits<::test::protocolpayloads::MainProtocol_TwoWayAnonWithError_Response> {
  using NaturalType = ::test_protocolpayloads::MainProtocolTwoWayAnonWithErrorResponse;
  static inline ::test_protocolpayloads::MainProtocolTwoWayAnonWithErrorResponse Convert(::test::protocolpayloads::MainProtocol_TwoWayAnonWithError_Response&&);
};
template <>
struct NaturalToHLCPPTraits<::test_protocolpayloads::MainProtocolOnAnonRequest> {
  using HLCPPType = ::test::protocolpayloads::MainProtocolOnAnonRequest;
  static inline ::test::protocolpayloads::MainProtocolOnAnonRequest Convert(::test_protocolpayloads::MainProtocolOnAnonRequest&&);
};
template <>
struct HLCPPToNaturalTraits<::test::protocolpayloads::MainProtocolOnAnonRequest> {
  using NaturalType = ::test_protocolpayloads::MainProtocolOnAnonRequest;
  static inline ::test_protocolpayloads::MainProtocolOnAnonRequest Convert(::test::protocolpayloads::MainProtocolOnAnonRequest&&);
};
template <>
struct NaturalToHLCPPTraits<::test_protocolpayloads::MainProtocolTwoWayLocalWithErrorResult> {
  using HLCPPType = ::test::protocolpayloads::MainProtocol_TwoWayLocalWithError_Result;
  static inline ::test::protocolpayloads::MainProtocol_TwoWayLocalWithError_Result Convert(::test_protocolpayloads::MainProtocolTwoWayLocalWithErrorResult&&);
};
template <>
struct HLCPPToNaturalTraits<::test::protocolpayloads::MainProtocol_TwoWayLocalWithError_Result> {
  using NaturalType = ::test_protocolpayloads::MainProtocolTwoWayLocalWithErrorResult;
  static inline ::test_protocolpayloads::MainProtocolTwoWayLocalWithErrorResult Convert(::test::protocolpayloads::MainProtocol_TwoWayLocalWithError_Result&&);
};
template <>
struct NaturalToHLCPPTraits<::test_protocolpayloads::MainProtocolTwoWayAnonWithErrorResult> {
  using HLCPPType = ::test::protocolpayloads::MainProtocol_TwoWayAnonWithError_Result;
  static inline ::test::protocolpayloads::MainProtocol_TwoWayAnonWithError_Result Convert(::test_protocolpayloads::MainProtocolTwoWayAnonWithErrorResult&&);
};
template <>
struct HLCPPToNaturalTraits<::test::protocolpayloads::MainProtocol_TwoWayAnonWithError_Result> {
  using NaturalType = ::test_protocolpayloads::MainProtocolTwoWayAnonWithErrorResult;
  static inline ::test_protocolpayloads::MainProtocolTwoWayAnonWithErrorResult Convert(::test::protocolpayloads::MainProtocol_TwoWayAnonWithError_Result&&);
};
template <>
struct NaturalToHLCPPTraits<::test_protocolpayloads::MainProtocolTwoWayImportWithErrorResult> {
  using HLCPPType = ::test::protocolpayloads::MainProtocol_TwoWayImportWithError_Result;
  static inline ::test::protocolpayloads::MainProtocol_TwoWayImportWithError_Result Convert(::test_protocolpayloads::MainProtocolTwoWayImportWithErrorResult&&);
};
template <>
struct HLCPPToNaturalTraits<::test::protocolpayloads::MainProtocol_TwoWayImportWithError_Result> {
  using NaturalType = ::test_protocolpayloads::MainProtocolTwoWayImportWithErrorResult;
  static inline ::test_protocolpayloads::MainProtocolTwoWayImportWithErrorResult Convert(::test::protocolpayloads::MainProtocol_TwoWayImportWithError_Result&&);
};

::test::protocolpayloads::LocalStructPayload NaturalToHLCPPTraits<::test_protocolpayloads::LocalStructPayload>::Convert(::test_protocolpayloads::LocalStructPayload&& value) {
  ::test::protocolpayloads::LocalStructPayload hlcpp;
  hlcpp.a = ::fidl::NaturalToHLCPP(std::move(value.a()));
  hlcpp.b = ::fidl::NaturalToHLCPP(std::move(value.b()));
  return hlcpp;
}

::test_protocolpayloads::LocalStructPayload HLCPPToNaturalTraits<::test::protocolpayloads::LocalStructPayload>::Convert(::test::protocolpayloads::LocalStructPayload&& value) {
  return ::test_protocolpayloads::LocalStructPayload{{
      .a = ::fidl::HLCPPToNatural(std::move(value.a)),
      .b = ::fidl::HLCPPToNatural(std::move(value.b)),
  }};
}
::test::protocolpayloads::MainProtocolOneWayAnonRequest NaturalToHLCPPTraits<::test_protocolpayloads::MainProtocolOneWayAnonRequest>::Convert(::test_protocolpayloads::MainProtocolOneWayAnonRequest&& value) {
  ::test::protocolpayloads::MainProtocolOneWayAnonRequest hlcpp;
  hlcpp.a = ::fidl::NaturalToHLCPP(std::move(value.a()));
  hlcpp.b = ::fidl::NaturalToHLCPP(std::move(value.b()));
  return hlcpp;
}

::test_protocolpayloads::MainProtocolOneWayAnonRequest HLCPPToNaturalTraits<::test::protocolpayloads::MainProtocolOneWayAnonRequest>::Convert(::test::protocolpayloads::MainProtocolOneWayAnonRequest&& value) {
  return ::test_protocolpayloads::MainProtocolOneWayAnonRequest{{
      .a = ::fidl::HLCPPToNatural(std::move(value.a)),
      .b = ::fidl::HLCPPToNatural(std::move(value.b)),
  }};
}
::test::protocolpayloads::MainProtocolTwoWayAnonRequest NaturalToHLCPPTraits<::test_protocolpayloads::MainProtocolTwoWayAnonRequest>::Convert(::test_protocolpayloads::MainProtocolTwoWayAnonRequest&& value) {
  ::test::protocolpayloads::MainProtocolTwoWayAnonRequest hlcpp;
  hlcpp.a = ::fidl::NaturalToHLCPP(std::move(value.a()));
  hlcpp.b = ::fidl::NaturalToHLCPP(std::move(value.b()));
  return hlcpp;
}

::test_protocolpayloads::MainProtocolTwoWayAnonRequest HLCPPToNaturalTraits<::test::protocolpayloads::MainProtocolTwoWayAnonRequest>::Convert(::test::protocolpayloads::MainProtocolTwoWayAnonRequest&& value) {
  return ::test_protocolpayloads::MainProtocolTwoWayAnonRequest{{
      .a = ::fidl::HLCPPToNatural(std::move(value.a)),
      .b = ::fidl::HLCPPToNatural(std::move(value.b)),
  }};
}
::test::protocolpayloads::MainProtocolTwoWayAnonResponse NaturalToHLCPPTraits<::test_protocolpayloads::MainProtocolTwoWayAnonResponse>::Convert(::test_protocolpayloads::MainProtocolTwoWayAnonResponse&& value) {
  ::test::protocolpayloads::MainProtocolTwoWayAnonResponse hlcpp;
  hlcpp.a = ::fidl::NaturalToHLCPP(std::move(value.a()));
  hlcpp.b = ::fidl::NaturalToHLCPP(std::move(value.b()));
  return hlcpp;
}

::test_protocolpayloads::MainProtocolTwoWayAnonResponse HLCPPToNaturalTraits<::test::protocolpayloads::MainProtocolTwoWayAnonResponse>::Convert(::test::protocolpayloads::MainProtocolTwoWayAnonResponse&& value) {
  return ::test_protocolpayloads::MainProtocolTwoWayAnonResponse{{
      .a = ::fidl::HLCPPToNatural(std::move(value.a)),
      .b = ::fidl::HLCPPToNatural(std::move(value.b)),
  }};
}
::test::protocolpayloads::MainProtocolTwoWayAnonWithErrorRequest NaturalToHLCPPTraits<::test_protocolpayloads::MainProtocolTwoWayAnonWithErrorRequest>::Convert(::test_protocolpayloads::MainProtocolTwoWayAnonWithErrorRequest&& value) {
  ::test::protocolpayloads::MainProtocolTwoWayAnonWithErrorRequest hlcpp;
  hlcpp.a = ::fidl::NaturalToHLCPP(std::move(value.a()));
  hlcpp.b = ::fidl::NaturalToHLCPP(std::move(value.b()));
  return hlcpp;
}

::test_protocolpayloads::MainProtocolTwoWayAnonWithErrorRequest HLCPPToNaturalTraits<::test::protocolpayloads::MainProtocolTwoWayAnonWithErrorRequest>::Convert(::test::protocolpayloads::MainProtocolTwoWayAnonWithErrorRequest&& value) {
  return ::test_protocolpayloads::MainProtocolTwoWayAnonWithErrorRequest{{
      .a = ::fidl::HLCPPToNatural(std::move(value.a)),
      .b = ::fidl::HLCPPToNatural(std::move(value.b)),
  }};
}
::test::protocolpayloads::MainProtocol_TwoWayAnonWithError_Response NaturalToHLCPPTraits<::test_protocolpayloads::MainProtocolTwoWayAnonWithErrorResponse>::Convert(::test_protocolpayloads::MainProtocolTwoWayAnonWithErrorResponse&& value) {
  ::test::protocolpayloads::MainProtocol_TwoWayAnonWithError_Response hlcpp;
  hlcpp.a = ::fidl::NaturalToHLCPP(std::move(value.a()));
  hlcpp.b = ::fidl::NaturalToHLCPP(std::move(value.b()));
  return hlcpp;
}

::test_protocolpayloads::MainProtocolTwoWayAnonWithErrorResponse HLCPPToNaturalTraits<::test::protocolpayloads::MainProtocol_TwoWayAnonWithError_Response>::Convert(::test::protocolpayloads::MainProtocol_TwoWayAnonWithError_Response&& value) {
  return ::test_protocolpayloads::MainProtocolTwoWayAnonWithErrorResponse{{
      .a = ::fidl::HLCPPToNatural(std::move(value.a)),
      .b = ::fidl::HLCPPToNatural(std::move(value.b)),
  }};
}
::test::protocolpayloads::MainProtocolOnAnonRequest NaturalToHLCPPTraits<::test_protocolpayloads::MainProtocolOnAnonRequest>::Convert(::test_protocolpayloads::MainProtocolOnAnonRequest&& value) {
  ::test::protocolpayloads::MainProtocolOnAnonRequest hlcpp;
  hlcpp.a = ::fidl::NaturalToHLCPP(std::move(value.a()));
  hlcpp.b = ::fidl::NaturalToHLCPP(std::move(value.b()));
  return hlcpp;
}

::test_protocolpayloads::MainProtocolOnAnonRequest HLCPPToNaturalTraits<::test::protocolpayloads::MainProtocolOnAnonRequest>::Convert(::test::protocolpayloads::MainProtocolOnAnonRequest&& value) {
  return ::test_protocolpayloads::MainProtocolOnAnonRequest{{
      .a = ::fidl::HLCPPToNatural(std::move(value.a)),
      .b = ::fidl::HLCPPToNatural(std::move(value.b)),
  }};
}

::test::protocolpayloads::MainProtocol_TwoWayLocalWithError_Result NaturalToHLCPPTraits<::test_protocolpayloads::MainProtocolTwoWayLocalWithErrorResult>::Convert(::test_protocolpayloads::MainProtocolTwoWayLocalWithErrorResult&& value) {
  ::test::protocolpayloads::MainProtocol_TwoWayLocalWithError_Result hlcpp;
  switch (value.Which()) {
    case ::test_protocolpayloads::MainProtocolTwoWayLocalWithErrorResult::Tag::kResponse:
      hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
      break;
    case ::test_protocolpayloads::MainProtocolTwoWayLocalWithErrorResult::Tag::kErr:
      hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
      break;
    default:
      break;
  }
  return hlcpp;
}

::test_protocolpayloads::MainProtocolTwoWayLocalWithErrorResult HLCPPToNaturalTraits<::test::protocolpayloads::MainProtocol_TwoWayLocalWithError_Result>::Convert(::test::protocolpayloads::MainProtocol_TwoWayLocalWithError_Result&& value) {
  using _NaturalUnion = ::test_protocolpayloads::MainProtocolTwoWayLocalWithErrorResult;
  switch (value.Which()) {
    case ::test::protocolpayloads::MainProtocol_TwoWayLocalWithError_Result::Tag::kResponse:
      return _NaturalUnion::WithResponse(
          ::fidl::HLCPPToNatural(std::move(value.response())));
    case ::test::protocolpayloads::MainProtocol_TwoWayLocalWithError_Result::Tag::kErr:
      return _NaturalUnion::WithErr(
          ::fidl::HLCPPToNatural(std::move(value.err())));
    default:
      ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::protocolpayloads::MainProtocol_TwoWayLocalWithError_Result");
  }
}
::test::protocolpayloads::MainProtocol_TwoWayAnonWithError_Result NaturalToHLCPPTraits<::test_protocolpayloads::MainProtocolTwoWayAnonWithErrorResult>::Convert(::test_protocolpayloads::MainProtocolTwoWayAnonWithErrorResult&& value) {
  ::test::protocolpayloads::MainProtocol_TwoWayAnonWithError_Result hlcpp;
  switch (value.Which()) {
    case ::test_protocolpayloads::MainProtocolTwoWayAnonWithErrorResult::Tag::kResponse:
      hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
      break;
    case ::test_protocolpayloads::MainProtocolTwoWayAnonWithErrorResult::Tag::kErr:
      hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
      break;
    default:
      break;
  }
  return hlcpp;
}

::test_protocolpayloads::MainProtocolTwoWayAnonWithErrorResult HLCPPToNaturalTraits<::test::protocolpayloads::MainProtocol_TwoWayAnonWithError_Result>::Convert(::test::protocolpayloads::MainProtocol_TwoWayAnonWithError_Result&& value) {
  using _NaturalUnion = ::test_protocolpayloads::MainProtocolTwoWayAnonWithErrorResult;
  switch (value.Which()) {
    case ::test::protocolpayloads::MainProtocol_TwoWayAnonWithError_Result::Tag::kResponse:
      return _NaturalUnion::WithResponse(
          ::fidl::HLCPPToNatural(std::move(value.response())));
    case ::test::protocolpayloads::MainProtocol_TwoWayAnonWithError_Result::Tag::kErr:
      return _NaturalUnion::WithErr(
          ::fidl::HLCPPToNatural(std::move(value.err())));
    default:
      ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::protocolpayloads::MainProtocol_TwoWayAnonWithError_Result");
  }
}
::test::protocolpayloads::MainProtocol_TwoWayImportWithError_Result NaturalToHLCPPTraits<::test_protocolpayloads::MainProtocolTwoWayImportWithErrorResult>::Convert(::test_protocolpayloads::MainProtocolTwoWayImportWithErrorResult&& value) {
  ::test::protocolpayloads::MainProtocol_TwoWayImportWithError_Result hlcpp;
  switch (value.Which()) {
    case ::test_protocolpayloads::MainProtocolTwoWayImportWithErrorResult::Tag::kResponse:
      hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
      break;
    case ::test_protocolpayloads::MainProtocolTwoWayImportWithErrorResult::Tag::kErr:
      hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
      break;
    default:
      break;
  }
  return hlcpp;
}

::test_protocolpayloads::MainProtocolTwoWayImportWithErrorResult HLCPPToNaturalTraits<::test::protocolpayloads::MainProtocol_TwoWayImportWithError_Result>::Convert(::test::protocolpayloads::MainProtocol_TwoWayImportWithError_Result&& value) {
  using _NaturalUnion = ::test_protocolpayloads::MainProtocolTwoWayImportWithErrorResult;
  switch (value.Which()) {
    case ::test::protocolpayloads::MainProtocol_TwoWayImportWithError_Result::Tag::kResponse:
      return _NaturalUnion::WithResponse(
          ::fidl::HLCPPToNatural(std::move(value.response())));
    case ::test::protocolpayloads::MainProtocol_TwoWayImportWithError_Result::Tag::kErr:
      return _NaturalUnion::WithErr(
          ::fidl::HLCPPToNatural(std::move(value.err())));
    default:
      ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::protocolpayloads::MainProtocol_TwoWayImportWithError_Result");
  }
}

#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
