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

#pragma once

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

#ifdef __Fuchsia__
}  // namespace fidl

template <>
class ::fidl::Event<::test_doccomments::Interface::OnEvent> final {
 public:
};

template <>
struct ::fidl::internal::MessageTraits<
    ::fidl::Event<::test_doccomments::Interface::OnEvent>>
    final {
 public:
  static constexpr bool kHasPayload = false;
};
namespace fidl {}  // namespace fidl
template <>
class ::fidl::internal::NaturalClientImpl<::test_doccomments::Interface> final
    : public ::fidl::internal::NaturalClientBase {
 public:
  using NaturalClientBase::NaturalClientBase;
  /// method comment #1
  ///
  /// method comment #3
  ::fitx::result<::fidl::Error> Method() const;
};
namespace fidl {
#endif  // __Fuchsia__

}  // namespace fidl
#ifdef __Fuchsia__

template <>
class ::fidl::internal::NaturalEventHandlerInterface<
    ::test_doccomments::Interface> {
 public:
  NaturalEventHandlerInterface() = default;
  virtual ~NaturalEventHandlerInterface() = default;
  /// event comment #1
  ///
  /// event comment #3
  virtual void OnEvent(
      ::fidl::Event<::test_doccomments::Interface::OnEvent>&) = 0;
};

template <>
class ::fidl::AsyncEventHandler<::test_doccomments::Interface>
    : public ::fidl::internal::NaturalEventHandlerInterface<
          ::test_doccomments::Interface>,
      public ::fidl::internal::AsyncEventHandler {
 public:
  AsyncEventHandler() = default;
  /// event comment #1
  ///
  /// event comment #3
  void OnEvent(
      ::fidl::Event<::test_doccomments::Interface::OnEvent>&) override {}
};

template <>
class ::fidl::internal::NaturalEventDispatcher<::test_doccomments::Interface>
    final : public ::fidl::internal::IncomingEventDispatcher<
                ::fidl::AsyncEventHandler<::test_doccomments::Interface>> {
 public:
  explicit NaturalEventDispatcher(
      ::fidl::AsyncEventHandler<::test_doccomments::Interface>* 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_doccomments::Interface>
    : public ::fidl::internal::WeakEventSenderBase {
 public:
  using WeakEventSenderBase::WeakEventSenderBase;

  /// event comment #1
  ///
  /// event comment #3
  ::fitx::result<::fidl::Error> OnEvent();
};

template <>
class ::fidl::internal::NaturalEventSender<::test_doccomments::Interface>
    : public ::fidl::internal::SyncEndpointManagedVeneer<
          ::fidl::internal::NaturalEventSender<::test_doccomments::Interface>> {
 public:
  using SyncEndpointManagedVeneer::SyncEndpointManagedVeneer;

  /// event comment #1
  ///
  /// event comment #3
  ::fitx::result<::fidl::Error> OnEvent();
};
#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
class ::fidl::Request<::test_doccomments::Interface::Method> final {
 public:
};

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

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

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

  using MethodRequest = ::fidl::Request<::test_doccomments::Interface::Method>;
  using MethodCompleter =
      ::fidl::internal::NaturalCompleter<::test_doccomments::Interface::Method>;

  /// method comment #1
  ///
  /// method comment #3
  virtual void Method(MethodRequest& request,
                      MethodCompleter::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_doccomments::Interface>
    final {
  NaturalServerDispatcher() = delete;
  static void Dispatch(::fidl::Server<::test_doccomments::Interface>* 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__
