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

// fidl_experiment = output_index_json

#pragma once

#include <fidl/test.union/cpp/markers.h>
#include <fidl/test.union/cpp/natural_types.h>
#include <fidl/test.union/cpp/wire_messaging.h>
#include <lib/fidl/cpp/channel.h>
#include <lib/fidl/cpp/client.h>
#include <lib/fidl/cpp/internal/thenable.h>
#include <lib/fidl/cpp/natural_types.h>
#include <lib/fidl/cpp/unified_messaging.h>
#include <lib/fidl/cpp/wire/unknown_interaction_handler.h>

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

namespace fidl {

}  // namespace fidl

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated> {
  using Response = ::test_union::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse;

  using Completer = fidl::Completer<::fidl::internal::NaturalCompleterBase<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated>>;
  using ResultCallback =
      ::fit::callback<void(::fidl::Result<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated>&)>;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated> {
  using Response = ::test_union::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse;

  using Completer = fidl::Completer<::fidl::internal::NaturalCompleterBase<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated>>;
  using ResultCallback =
      ::fit::callback<void(::fidl::Result<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated>&)>;
};

#ifdef __Fuchsia__

template <>
class ::fidl::Response<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated> final : public ::test_union::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse {
 public:
  using ::test_union::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse;
  Response(::test_union::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse v) : TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse(std::move(v)) {}
};

template <>
class ::fidl::Result<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated> final : public ::fit::result<::fidl::Error, ::test_union::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse> {
 public:
  using ::fit::result<::fidl::Error, ::test_union::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse>::result;

 protected:
  Result() = default;
};

template <>
class ::fidl::Response<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated> final : public ::test_union::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse {
 public:
  using ::test_union::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse;
  Response(::test_union::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse v) : TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse(std::move(v)) {}
};

template <>
class ::fidl::Result<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated> final : public ::fit::result<::fidl::Error, ::test_union::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse> {
 public:
  using ::fit::result<::fidl::Error, ::test_union::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse>::result;

 protected:
  Result() = default;
};

template <>
class ::fidl::internal::NaturalClientImpl<::test_union::TestProtocol> final : public ::fidl::internal::NaturalClientBase {
 public:
  using NaturalClientBase::NaturalClientBase;
  ::fidl::internal::NaturalThenable<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated> StrictUnionHenceResponseMayBeStackAllocated() const;

  ::fidl::internal::NaturalThenable<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated> FlexibleUnionHenceResponseMustBeHeapAllocated() const;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
class ::fidl::internal::NaturalSyncClientImpl<::test_union::TestProtocol> final
    : public ::fidl::internal::SyncEndpointManagedVeneer<::fidl::internal::NaturalSyncClientImpl<::test_union::TestProtocol>> {
 public:
  ::fidl::Result<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated> StrictUnionHenceResponseMayBeStackAllocated();

  ::fidl::Result<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated> FlexibleUnionHenceResponseMustBeHeapAllocated();

 private:
  ::fidl::UnownedClientEnd<::test_union::TestProtocol> _client_end() const {
    return ::fidl::UnownedClientEnd<::test_union::TestProtocol>(
        _transport().get<::fidl::internal::ChannelTransport>());
  }
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
class ::fidl::internal::NaturalEventHandlerInterface<::test_union::TestProtocol> : public ::fidl::internal::BaseEventHandlerInterface {
 public:
  NaturalEventHandlerInterface() = default;
  virtual ~NaturalEventHandlerInterface() = default;
};

template <>
class ::fidl::AsyncEventHandler<::test_union::TestProtocol>
    : public ::fidl::internal::NaturalEventHandlerInterface<::test_union::TestProtocol>, public ::fidl::internal::AsyncEventHandler {
 public:
  AsyncEventHandler() = default;
};

template <>
class ::fidl::SyncEventHandler<::test_union::TestProtocol>
    : public ::fidl::internal::NaturalEventHandlerInterface<::test_union::TestProtocol>, public ::fidl::internal::SyncEventHandler {
 public:
  SyncEventHandler() = default;

  // Handle all possible events defined in this protocol.
  // Blocks to consume exactly one message from the channel, then call the corresponding virtual
  // method.
  ::fidl::Status HandleOneEvent(
      ::fidl::UnownedClientEnd<::test_union::TestProtocol> client_end);
};

template <>
class ::fidl::internal::NaturalEventDispatcher<::test_union::TestProtocol> final : public ::fidl::internal::IncomingEventDispatcher<::fidl::internal::NaturalEventHandlerInterface<::test_union::TestProtocol>> {
 public:
  explicit NaturalEventDispatcher(::fidl::internal::NaturalEventHandlerInterface<::test_union::TestProtocol>* event_handler)
      : IncomingEventDispatcher(event_handler) {}
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
class ::fidl::internal::NaturalWeakEventSender<::test_union::TestProtocol> : public ::fidl::internal::WeakEventSenderBase {
 public:
  using WeakEventSenderBase::WeakEventSenderBase;
};

template <>
class ::fidl::internal::NaturalEventSender<::test_union::TestProtocol>
    : public ::fidl::internal::SyncEndpointManagedVeneer<::fidl::internal::NaturalEventSender<::test_union::TestProtocol>> {
 public:
  using SyncEndpointManagedVeneer::SyncEndpointManagedVeneer;
};

#endif  // __Fuchsia__

template <>
class ::fidl::internal::NaturalCompleterBase<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated> : public ::fidl::CompleterBase {
 public:
  void Reply(const ::fidl::Response<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated>& response);

 protected:
  using ::fidl::CompleterBase::CompleterBase;
};

template <>
class ::fidl::internal::NaturalCompleterBase<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated> : public ::fidl::CompleterBase {
 public:
  void Reply(const ::fidl::Response<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated>& response);

 protected:
  using ::fidl::CompleterBase::CompleterBase;
};

template <>
class ::fidl::Server<::test_union::TestProtocol> : public ::fidl::internal::IncomingMessageDispatcher {
 public:
  Server() = default;
  virtual ~Server() = default;

  // The FIDL protocol type that is implemented by this server.
  using _EnclosingProtocol = ::test_union::TestProtocol;

  using Handler = fidl::ProtocolHandler<::test_union::TestProtocol>;

  using StrictUnionHenceResponseMayBeStackAllocatedCompleter = ::fidl::internal::NaturalCompleter<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated>;

  virtual void StrictUnionHenceResponseMayBeStackAllocated(
      StrictUnionHenceResponseMayBeStackAllocatedCompleter::Sync& completer) = 0;

  using FlexibleUnionHenceResponseMustBeHeapAllocatedCompleter = ::fidl::internal::NaturalCompleter<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated>;

  virtual void FlexibleUnionHenceResponseMustBeHeapAllocated(
      FlexibleUnionHenceResponseMustBeHeapAllocatedCompleter::Sync& completer) = 0;

  // |bind_handler| returns a handler that binds incoming connections to this
  // server implementation.
  //
  // The returned handler borrows the server instance.
  // The server must outlive the provided |dispatcher|. Only after
  // the dispatcher is shutdown will it be safe to destroy the servers.
  // The server should not be moved.
  Handler bind_handler(async_dispatcher_t* dispatcher) {
    return [impl = this, dispatcher = dispatcher](::fidl::ServerEnd<::test_union::TestProtocol> request) {
      (void)::fidl::BindServer(dispatcher, std::move(request), impl);
    };
  }

 private:
  void dispatch_message(
      ::fidl::IncomingHeaderAndMessage&& msg, ::fidl::Transaction* txn,
      ::fidl::internal::MessageStorageViewBase* storage_view) final;
};

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::NaturalServerDispatcher<::test_union::TestProtocol> final {
  NaturalServerDispatcher() = delete;
  static void Dispatch(::fidl::Server<::test_union::TestProtocol>* impl, ::fidl::IncomingHeaderAndMessage&& msg,
                       internal::MessageStorageViewBase* storage_view,
                       ::fidl::Transaction* txn);

 private:
  static const ::fidl::internal::MethodEntry entries_[];
  static const ::fidl::internal::MethodEntry* entries_end_;
  static constexpr const ::fidl::internal::UnknownMethodHandlerEntry& unknown_method_handler_entry_ =
      ::fidl::internal::UnknownMethodHandlerEntry::kClosedProtocolHandlerEntry;
};

#endif  // __Fuchsia__

#pragma clang diagnostic pop
