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

#pragma once

#include <fidl/test.unknowninteractions/cpp/markers.h>
#include <fidl/test.unknowninteractions/cpp/natural_types.h>
#include <fidl/test.unknowninteractions/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>

namespace fidl {}  // namespace fidl
template <>
struct ::fidl::internal::NaturalMethodTypes<
    ::test_unknowninteractions::Example::StrictTwoWay> {
  using Completer = fidl::Completer<::fidl::internal::NaturalCompleterBase<
      ::test_unknowninteractions::Example::StrictTwoWay>>;

  using ResultCallback = ::fit::callback<void(
      ::fidl::Result<::test_unknowninteractions::Example::StrictTwoWay>&)>;

  static constexpr bool HasApplicationError = false;

  static constexpr bool IsAbsentBody = true;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<
    ::test_unknowninteractions::Example::FlexibleTwoWay> {
  using Completer = fidl::Completer<::fidl::internal::NaturalCompleterBase<
      ::test_unknowninteractions::Example::FlexibleTwoWay>>;

  using ResultCallback = ::fit::callback<void(
      ::fidl::Result<::test_unknowninteractions::Example::FlexibleTwoWay>&)>;

  static constexpr bool HasApplicationError = false;

  static constexpr bool IsAbsentBody = false;
};

namespace test_unknowninteractions {
__LOCAL extern "C" const fidl_type_t
    test_unknowninteractions_ExampleFlexibleTwoWayTopResponseTable;

#ifdef __Fuchsia__
}  // namespace test_unknowninteractions

template <>
class ::fidl::Event<::test_unknowninteractions::Example::StrictEvent> final {
 public:
};

template <>
struct ::fidl::internal::MessageTraits<
    ::fidl::Event<::test_unknowninteractions::Example::StrictEvent>>
    final {
 public:
  static constexpr bool kHasPayload = false;
};
namespace test_unknowninteractions {}  // namespace test_unknowninteractions

template <>
class ::fidl::Event<::test_unknowninteractions::Example::FlexibleEvent> final {
 public:
};

template <>
struct ::fidl::internal::MessageTraits<
    ::fidl::Event<::test_unknowninteractions::Example::FlexibleEvent>>
    final {
 public:
  static constexpr bool kHasPayload = false;
};
namespace test_unknowninteractions {}  // namespace test_unknowninteractions

template <>
class ::fidl::Response<::test_unknowninteractions::Example::StrictTwoWay>
    final {
 public:
};

template <>
struct ::fidl::internal::MessageTraits<
    ::fidl::Response<::test_unknowninteractions::Example::StrictTwoWay>>
    final {
 public:
  static constexpr bool kHasPayload = false;
};
namespace test_unknowninteractions {}  // namespace test_unknowninteractions
template <>
class ::fidl::Result<::test_unknowninteractions::Example::StrictTwoWay> final
    : public ::fitx::result<::fidl::Error> {
 public:
  using ::fitx::result<::fidl::Error>::result;

 protected:
  Result() = default;
};

template <>
class ::fidl::Response<::test_unknowninteractions::Example::FlexibleTwoWay>
    final
    : public ::test_unknowninteractions::ExampleFlexibleTwoWayTopResponse {
 public:
  using ::test_unknowninteractions::ExampleFlexibleTwoWayTopResponse::
      ExampleFlexibleTwoWayTopResponse;
  Response(::test_unknowninteractions::ExampleFlexibleTwoWayTopResponse v)
      : ExampleFlexibleTwoWayTopResponse(std::move(v)) {}
};

template <>
struct ::fidl::internal::MessageTraits<
    ::fidl::Response<::test_unknowninteractions::Example::FlexibleTwoWay>>
    final {
 public:
  static constexpr bool kHasPayload = true;
  using Payload = ::test_unknowninteractions::ExampleFlexibleTwoWayTopResponse;
};
template <>
class ::fidl::Result<::test_unknowninteractions::Example::FlexibleTwoWay> final
    : public ::fitx::result<
          ::fidl::Error,
          ::test_unknowninteractions::ExampleFlexibleTwoWayTopResponse> {
 public:
  using ::fitx::result<
      ::fidl::Error,
      ::test_unknowninteractions::ExampleFlexibleTwoWayTopResponse>::result;

 protected:
  Result() = default;
};

template <>
class ::fidl::internal::NaturalClientImpl<::test_unknowninteractions::Example>
    final : public ::fidl::internal::NaturalClientBase {
 public:
  using NaturalClientBase::NaturalClientBase;
  ::fidl::internal::NaturalThenable<
      ::test_unknowninteractions::Example::StrictTwoWay>
  StrictTwoWay() const;

  ::fidl::internal::NaturalThenable<
      ::test_unknowninteractions::Example::FlexibleTwoWay>
  FlexibleTwoWay() const;

  ::fitx::result<::fidl::Error> StrictOneWay() const;

  ::fitx::result<::fidl::Error> FlexibleOneWay() const;
};
namespace test_unknowninteractions {
#endif  // __Fuchsia__

}  // namespace test_unknowninteractions
#ifdef __Fuchsia__

template <>
class ::fidl::internal::NaturalEventHandlerInterface<
    ::test_unknowninteractions::Example> {
 public:
  NaturalEventHandlerInterface() = default;
  virtual ~NaturalEventHandlerInterface() = default;
  virtual void StrictEvent(
      ::fidl::Event<::test_unknowninteractions::Example::StrictEvent>&) = 0;
  virtual void FlexibleEvent(
      ::fidl::Event<::test_unknowninteractions::Example::FlexibleEvent>&) = 0;
};

template <>
class ::fidl::AsyncEventHandler<::test_unknowninteractions::Example>
    : public ::fidl::internal::NaturalEventHandlerInterface<
          ::test_unknowninteractions::Example>,
      public ::fidl::internal::AsyncEventHandler {
 public:
  AsyncEventHandler() = default;
  void StrictEvent(
      ::fidl::Event<::test_unknowninteractions::Example::StrictEvent>&)
      override {}
  void FlexibleEvent(
      ::fidl::Event<::test_unknowninteractions::Example::FlexibleEvent>&)
      override {}
};

template <>
class ::fidl::internal::NaturalEventDispatcher<
    ::test_unknowninteractions::Example>
    final
    : public ::fidl::internal::IncomingEventDispatcher<
          ::fidl::AsyncEventHandler<::test_unknowninteractions::Example>> {
 public:
  explicit NaturalEventDispatcher(
      ::fidl::AsyncEventHandler<::test_unknowninteractions::Example>*
          event_handler)
      : IncomingEventDispatcher(event_handler) {}

 private:
  std::optional<::fidl::UnbindInfo> DispatchEvent(
      ::fidl::IncomingMessage& msg,
      internal::IncomingTransportContext transport_context) override;
};
#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
class ::fidl::internal::NaturalWeakEventSender<
    ::test_unknowninteractions::Example>
    : public ::fidl::internal::WeakEventSenderBase {
 public:
  using WeakEventSenderBase::WeakEventSenderBase;

  ::fitx::result<::fidl::Error> StrictEvent();

  ::fitx::result<::fidl::Error> FlexibleEvent();
};

template <>
class ::fidl::internal::NaturalEventSender<::test_unknowninteractions::Example>
    : public ::fidl::internal::SyncEndpointManagedVeneer<
          ::fidl::internal::NaturalEventSender<
              ::test_unknowninteractions::Example>> {
 public:
  using SyncEndpointManagedVeneer::SyncEndpointManagedVeneer;

  ::fitx::result<::fidl::Error> StrictEvent();

  ::fitx::result<::fidl::Error> FlexibleEvent();
};
#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
class ::fidl::Request<::test_unknowninteractions::Example::StrictOneWay> final {
 public:
};

template <>
struct ::fidl::internal::MessageTraits<
    ::fidl::Request<::test_unknowninteractions::Example::StrictOneWay>>
    final {
 public:
  static constexpr bool kHasPayload = false;
};
#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
class ::fidl::Request<::test_unknowninteractions::Example::FlexibleOneWay>
    final {
 public:
};

template <>
struct ::fidl::internal::MessageTraits<
    ::fidl::Request<::test_unknowninteractions::Example::FlexibleOneWay>>
    final {
 public:
  static constexpr bool kHasPayload = false;
};
#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
class ::fidl::Request<::test_unknowninteractions::Example::StrictTwoWay> final {
 public:
};

template <>
struct ::fidl::internal::MessageTraits<
    ::fidl::Request<::test_unknowninteractions::Example::StrictTwoWay>>
    final {
 public:
  static constexpr bool kHasPayload = false;
};
#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
class ::fidl::Request<::test_unknowninteractions::Example::FlexibleTwoWay>
    final {
 public:
};

template <>
struct ::fidl::internal::MessageTraits<
    ::fidl::Request<::test_unknowninteractions::Example::FlexibleTwoWay>>
    final {
 public:
  static constexpr bool kHasPayload = false;
};
#endif  // __Fuchsia__

template <>
class ::fidl::internal::NaturalCompleterBase<
    ::test_unknowninteractions::Example::StrictTwoWay>
    : public ::fidl::CompleterBase {
 public:
  void Reply();

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

template <>
class ::fidl::internal::NaturalCompleterBase<
    ::test_unknowninteractions::Example::FlexibleTwoWay>
    : public ::fidl::CompleterBase {
 public:
  void Reply(
      ::fidl::Response<::test_unknowninteractions::Example::FlexibleTwoWay>&&
          response);

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

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

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

  using StrictOneWayRequest =
      ::fidl::Request<::test_unknowninteractions::Example::StrictOneWay>;
  using StrictOneWayCompleter = ::fidl::internal::NaturalCompleter<
      ::test_unknowninteractions::Example::StrictOneWay>;

  virtual void StrictOneWay(StrictOneWayRequest& request,
                            StrictOneWayCompleter::Sync& completer) = 0;

  using FlexibleOneWayRequest =
      ::fidl::Request<::test_unknowninteractions::Example::FlexibleOneWay>;
  using FlexibleOneWayCompleter = ::fidl::internal::NaturalCompleter<
      ::test_unknowninteractions::Example::FlexibleOneWay>;

  virtual void FlexibleOneWay(FlexibleOneWayRequest& request,
                              FlexibleOneWayCompleter::Sync& completer) = 0;

  using StrictTwoWayRequest =
      ::fidl::Request<::test_unknowninteractions::Example::StrictTwoWay>;
  using StrictTwoWayCompleter = ::fidl::internal::NaturalCompleter<
      ::test_unknowninteractions::Example::StrictTwoWay>;

  virtual void StrictTwoWay(StrictTwoWayRequest& request,
                            StrictTwoWayCompleter::Sync& completer) = 0;

  using FlexibleTwoWayRequest =
      ::fidl::Request<::test_unknowninteractions::Example::FlexibleTwoWay>;
  using FlexibleTwoWayCompleter = ::fidl::internal::NaturalCompleter<
      ::test_unknowninteractions::Example::FlexibleTwoWay>;

  virtual void FlexibleTwoWay(FlexibleTwoWayRequest& request,
                              FlexibleTwoWayCompleter::Sync& completer) = 0;

 private:
  void dispatch_message(
      ::fidl::IncomingMessage&& msg, ::fidl::Transaction* txn,
      ::fidl::internal::IncomingTransportContext transport_context) final;
};

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::NaturalServerDispatcher<
    ::test_unknowninteractions::Example>
    final {
  NaturalServerDispatcher() = delete;
  static void Dispatch(
      ::fidl::Server<::test_unknowninteractions::Example>* impl,
      ::fidl::IncomingMessage&& msg,
      internal::IncomingTransportContext transport_context,
      ::fidl::Transaction* txn);

 private:
  static const ::fidl::internal::MethodEntry entries_[];
  static const ::fidl::internal::MethodEntry* entries_end_;
};
#endif  // __Fuchsia__
