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

// fidl_experiment = output_index_json

#pragma once

#include <fidl/test.protocollayoutssamelibrary/cpp/markers.h>
#include <fidl/test.protocollayoutssamelibrary/cpp/natural_types.h>
#include <fidl/test.protocollayoutssamelibrary/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_protocollayoutssamelibrary::ComposedProtocol::OneWayAnonComposed> {
  using Request = ::test_protocollayoutssamelibrary::ComposedProtocolOneWayAnonComposedRequest;

  using Completer = fidl::Completer<>;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposed> {
  using Request = ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedRequest;

  using Response = ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedResponse;

  using Completer = fidl::Completer<::fidl::internal::NaturalCompleterBase<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposed>>;
  using ResultCallback =
      ::fit::callback<void(::fidl::Result<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposed>&)>;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposedWithError> {
  using Request = ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorRequest;

  using Response = ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResult;

  using Completer = fidl::Completer<::fidl::internal::NaturalCompleterBase<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposedWithError>>;
  using ResultCallback =
      ::fit::callback<void(::fidl::Result<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposedWithError>&)>;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayoutssamelibrary::ComposedProtocol::OnAnonComposed> {
  using Request = ::test_protocollayoutssamelibrary::ComposedProtocolOnAnonComposedRequest;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayoutssamelibrary::ComposedProtocol::OneWayNamedComposed> {
  using Request = ::test_protocollayoutssamelibrary::TablePayload;

  using Completer = fidl::Completer<>;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposed> {
  using Request = ::test_protocollayoutssamelibrary::UnionPayload;

  using Response = ::test_protocollayoutssamelibrary::TablePayload;

  using Completer = fidl::Completer<::fidl::internal::NaturalCompleterBase<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposed>>;
  using ResultCallback =
      ::fit::callback<void(::fidl::Result<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposed>&)>;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposedWithError> {
  using Request = ::test_protocollayoutssamelibrary::TablePayload;

  using Response = ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayNamedComposedWithErrorResult;

  using Completer = fidl::Completer<::fidl::internal::NaturalCompleterBase<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposedWithError>>;
  using ResultCallback =
      ::fit::callback<void(::fidl::Result<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposedWithError>&)>;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayoutssamelibrary::ComposedProtocol::OnNamedComposed> {
  using Request = ::test_protocollayoutssamelibrary::UnionPayload;
};

#ifdef __Fuchsia__

template <>
class ::fidl::Response<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposed> final : public ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedResponse {
 public:
  using ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedResponse::ComposedProtocolTwoWayAnonComposedResponse;
  Response(::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedResponse v) : ComposedProtocolTwoWayAnonComposedResponse(std::move(v)) {}
};

template <>
class ::fidl::Result<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposed> final : public ::fit::result<::fidl::Error, ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedResponse> {
 public:
  using ::fit::result<::fidl::Error, ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedResponse>::result;

 protected:
  Result() = default;
};

template <>
class ::fidl::Response<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposedWithError> final : public ::fit::result<uint32_t, ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResponse> {
 public:
  using ::fit::result<uint32_t, ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResponse>::result;
  Response(::fit::result<uint32_t, ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResponse> v) : result(std::move(v)) {}
  Response() = delete;
};
template <>
class ::fidl::internal::ResponseMessageConverter<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposedWithError> {
  using DomainObject = ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResult;

 public:
  static DomainObject IntoDomainObject(const ::fidl::Response<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposedWithError>& m) {
    if (m.is_error()) {
      return DomainObject::WithErr(m.error_value());
    } else {
      return DomainObject::WithResponse(std::move(m.value()));
    }
  }
};

template <>
class ::fidl::Result<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposedWithError> final : public ::fit::result<::fidl::ErrorsIn<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposedWithError>, ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResponse> {
 public:
  using ::fit::result<::fidl::ErrorsIn<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposedWithError>, ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResponse>::result;

 protected:
  Result() = default;
};

template <>
class ::fidl::Response<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposed> final : public ::test_protocollayoutssamelibrary::TablePayload {
 public:
  using ::test_protocollayoutssamelibrary::TablePayload::TablePayload;
  Response(::test_protocollayoutssamelibrary::TablePayload v) : TablePayload(std::move(v)) {}
};

template <>
class ::fidl::Result<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposed> final : public ::fit::result<::fidl::Error, ::test_protocollayoutssamelibrary::TablePayload> {
 public:
  using ::fit::result<::fidl::Error, ::test_protocollayoutssamelibrary::TablePayload>::result;

 protected:
  Result() = default;
};

template <>
class ::fidl::Response<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposedWithError> final : public ::fit::result<uint32_t, ::test_protocollayoutssamelibrary::UnionPayload> {
 public:
  using ::fit::result<uint32_t, ::test_protocollayoutssamelibrary::UnionPayload>::result;
  Response(::fit::result<uint32_t, ::test_protocollayoutssamelibrary::UnionPayload> v) : result(std::move(v)) {}
  Response() = delete;
};
template <>
class ::fidl::internal::ResponseMessageConverter<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposedWithError> {
  using DomainObject = ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayNamedComposedWithErrorResult;

 public:
  static DomainObject IntoDomainObject(const ::fidl::Response<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposedWithError>& m) {
    if (m.is_error()) {
      return DomainObject::WithErr(m.error_value());
    } else {
      return DomainObject::WithResponse(std::move(m.value()));
    }
  }
};

template <>
class ::fidl::Result<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposedWithError> final : public ::fit::result<::fidl::ErrorsIn<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposedWithError>, ::test_protocollayoutssamelibrary::UnionPayload> {
 public:
  using ::fit::result<::fidl::ErrorsIn<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposedWithError>, ::test_protocollayoutssamelibrary::UnionPayload>::result;

 protected:
  Result() = default;
};

template <>
class ::fidl::internal::NaturalClientImpl<::test_protocollayoutssamelibrary::ComposedProtocol> final : public ::fidl::internal::NaturalClientBase {
 public:
  using NaturalClientBase::NaturalClientBase;
  ::fidl::internal::NaturalThenable<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposed> TwoWayAnonComposed(const ::fidl::Request<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposed>& request) const;

  ::fidl::internal::NaturalThenable<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposedWithError> TwoWayAnonComposedWithError(const ::fidl::Request<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposedWithError>& request) const;

  ::fidl::internal::NaturalThenable<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposed> TwoWayNamedComposed(const ::fidl::Request<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposed>& request) const;

  ::fidl::internal::NaturalThenable<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposedWithError> TwoWayNamedComposedWithError(const ::fidl::Request<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposedWithError>& request) const;

  ::fit::result<::fidl::OneWayError> OneWayAnonComposed(const ::fidl::Request<::test_protocollayoutssamelibrary::ComposedProtocol::OneWayAnonComposed>& request) const;

  ::fit::result<::fidl::OneWayError> OneWayNamedComposed(const ::fidl::Request<::test_protocollayoutssamelibrary::ComposedProtocol::OneWayNamedComposed>& request) const;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
class ::fidl::internal::NaturalSyncClientImpl<::test_protocollayoutssamelibrary::ComposedProtocol> final
    : public ::fidl::internal::SyncEndpointManagedVeneer<::fidl::internal::NaturalSyncClientImpl<::test_protocollayoutssamelibrary::ComposedProtocol>> {
 public:
  ::fidl::Result<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposed> TwoWayAnonComposed(const ::fidl::Request<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposed>& request);

  ::fidl::Result<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposedWithError> TwoWayAnonComposedWithError(const ::fidl::Request<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposedWithError>& request);

  ::fidl::Result<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposed> TwoWayNamedComposed(const ::fidl::Request<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposed>& request);

  ::fidl::Result<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposedWithError> TwoWayNamedComposedWithError(const ::fidl::Request<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposedWithError>& request);

  ::fit::result<::fidl::OneWayError> OneWayAnonComposed(const ::fidl::Request<::test_protocollayoutssamelibrary::ComposedProtocol::OneWayAnonComposed>& request);

  ::fit::result<::fidl::OneWayError> OneWayNamedComposed(const ::fidl::Request<::test_protocollayoutssamelibrary::ComposedProtocol::OneWayNamedComposed>& request);

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

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
class ::fidl::internal::NaturalEventHandlerInterface<::test_protocollayoutssamelibrary::ComposedProtocol> : public ::fidl::internal::BaseEventHandlerInterface {
 public:
  NaturalEventHandlerInterface() = default;
  virtual ~NaturalEventHandlerInterface() = default;
  virtual void OnAnonComposed(::fidl::Event<::test_protocollayoutssamelibrary::ComposedProtocol::OnAnonComposed>&) = 0;
  virtual void OnNamedComposed(::fidl::Event<::test_protocollayoutssamelibrary::ComposedProtocol::OnNamedComposed>&) = 0;
};

template <>
class ::fidl::AsyncEventHandler<::test_protocollayoutssamelibrary::ComposedProtocol>
    : public ::fidl::internal::NaturalEventHandlerInterface<::test_protocollayoutssamelibrary::ComposedProtocol>, public ::fidl::internal::AsyncEventHandler {
 public:
  AsyncEventHandler() = default;
  void OnAnonComposed(::fidl::Event<::test_protocollayoutssamelibrary::ComposedProtocol::OnAnonComposed>&) override {}
  void OnNamedComposed(::fidl::Event<::test_protocollayoutssamelibrary::ComposedProtocol::OnNamedComposed>&) override {}
};

template <>
class ::fidl::SyncEventHandler<::test_protocollayoutssamelibrary::ComposedProtocol>
    : public ::fidl::internal::NaturalEventHandlerInterface<::test_protocollayoutssamelibrary::ComposedProtocol>, 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_protocollayoutssamelibrary::ComposedProtocol> client_end);
};

template <>
class ::fidl::internal::NaturalEventDispatcher<::test_protocollayoutssamelibrary::ComposedProtocol> final : public ::fidl::internal::IncomingEventDispatcher<::fidl::internal::NaturalEventHandlerInterface<::test_protocollayoutssamelibrary::ComposedProtocol>> {
 public:
  explicit NaturalEventDispatcher(::fidl::internal::NaturalEventHandlerInterface<::test_protocollayoutssamelibrary::ComposedProtocol>* event_handler)
      : IncomingEventDispatcher(event_handler) {}
  ::fidl::Status DispatchEvent(
      ::fidl::IncomingHeaderAndMessage& msg,
      internal::MessageStorageViewBase* storage_view) override;
};

#endif  // __Fuchsia__

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

  ::fit::result<::fidl::OneWayError> OnAnonComposed(const ::test_protocollayoutssamelibrary::ComposedProtocolOnAnonComposedRequest& payload);

  ::fit::result<::fidl::OneWayError> OnNamedComposed(const ::test_protocollayoutssamelibrary::UnionPayload& payload);
};

template <>
class ::fidl::internal::NaturalEventSender<::test_protocollayoutssamelibrary::ComposedProtocol>
    : public ::fidl::internal::SyncEndpointManagedVeneer<::fidl::internal::NaturalEventSender<::test_protocollayoutssamelibrary::ComposedProtocol>> {
 public:
  using SyncEndpointManagedVeneer::SyncEndpointManagedVeneer;

  ::fit::result<::fidl::OneWayError> OnAnonComposed(const ::test_protocollayoutssamelibrary::ComposedProtocolOnAnonComposedRequest& payload);

  ::fit::result<::fidl::OneWayError> OnNamedComposed(const ::test_protocollayoutssamelibrary::UnionPayload& payload);
};

#endif  // __Fuchsia__

template <>
class ::fidl::internal::NaturalCompleterBase<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposed> : public ::fidl::CompleterBase {
 public:
  void Reply(const ::fidl::Response<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposed>& response);

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

template <>
class ::fidl::internal::NaturalCompleterBase<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposedWithError> : public ::fidl::CompleterBase {
 public:
  void Reply(const ::fidl::Response<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposedWithError>& response);

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

template <>
class ::fidl::internal::NaturalCompleterBase<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposed> : public ::fidl::CompleterBase {
 public:
  void Reply(const ::fidl::Response<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposed>& response);

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

template <>
class ::fidl::internal::NaturalCompleterBase<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposedWithError> : public ::fidl::CompleterBase {
 public:
  void Reply(const ::fidl::Response<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposedWithError>& response);

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

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

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

  using Handler = fidl::ProtocolHandler<::test_protocollayoutssamelibrary::ComposedProtocol>;

  using OneWayAnonComposedRequest = ::fidl::Request<::test_protocollayoutssamelibrary::ComposedProtocol::OneWayAnonComposed>;
  using OneWayAnonComposedCompleter = ::fidl::internal::NaturalCompleter<::test_protocollayoutssamelibrary::ComposedProtocol::OneWayAnonComposed>;

  virtual void OneWayAnonComposed(OneWayAnonComposedRequest& request,
                                  OneWayAnonComposedCompleter::Sync& completer) = 0;

  using TwoWayAnonComposedRequest = ::fidl::Request<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposed>;
  using TwoWayAnonComposedCompleter = ::fidl::internal::NaturalCompleter<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposed>;

  virtual void TwoWayAnonComposed(TwoWayAnonComposedRequest& request,
                                  TwoWayAnonComposedCompleter::Sync& completer) = 0;

  using TwoWayAnonComposedWithErrorRequest = ::fidl::Request<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposedWithError>;
  using TwoWayAnonComposedWithErrorCompleter = ::fidl::internal::NaturalCompleter<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayAnonComposedWithError>;

  virtual void TwoWayAnonComposedWithError(TwoWayAnonComposedWithErrorRequest& request,
                                           TwoWayAnonComposedWithErrorCompleter::Sync& completer) = 0;

  using OneWayNamedComposedRequest = ::fidl::Request<::test_protocollayoutssamelibrary::ComposedProtocol::OneWayNamedComposed>;
  using OneWayNamedComposedCompleter = ::fidl::internal::NaturalCompleter<::test_protocollayoutssamelibrary::ComposedProtocol::OneWayNamedComposed>;

  virtual void OneWayNamedComposed(OneWayNamedComposedRequest& request,
                                   OneWayNamedComposedCompleter::Sync& completer) = 0;

  using TwoWayNamedComposedRequest = ::fidl::Request<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposed>;
  using TwoWayNamedComposedCompleter = ::fidl::internal::NaturalCompleter<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposed>;

  virtual void TwoWayNamedComposed(TwoWayNamedComposedRequest& request,
                                   TwoWayNamedComposedCompleter::Sync& completer) = 0;

  using TwoWayNamedComposedWithErrorRequest = ::fidl::Request<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposedWithError>;
  using TwoWayNamedComposedWithErrorCompleter = ::fidl::internal::NaturalCompleter<::test_protocollayoutssamelibrary::ComposedProtocol::TwoWayNamedComposedWithError>;

  virtual void TwoWayNamedComposedWithError(TwoWayNamedComposedWithErrorRequest& request,
                                            TwoWayNamedComposedWithErrorCompleter::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_protocollayoutssamelibrary::ComposedProtocol> 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_protocollayoutssamelibrary::ComposedProtocol> final {
  NaturalServerDispatcher() = delete;
  static void Dispatch(::fidl::Server<::test_protocollayoutssamelibrary::ComposedProtocol>* 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__

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayoutssamelibrary::MainProtocol::OneWayAnonComposed> {
  using Request = ::test_protocollayoutssamelibrary::ComposedProtocolOneWayAnonComposedRequest;

  using Completer = fidl::Completer<>;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposed> {
  using Request = ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedRequest;

  using Response = ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedResponse;

  using Completer = fidl::Completer<::fidl::internal::NaturalCompleterBase<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposed>>;
  using ResultCallback =
      ::fit::callback<void(::fidl::Result<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposed>&)>;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposedWithError> {
  using Request = ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorRequest;

  using Response = ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResult;

  using Completer = fidl::Completer<::fidl::internal::NaturalCompleterBase<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposedWithError>>;
  using ResultCallback =
      ::fit::callback<void(::fidl::Result<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposedWithError>&)>;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayoutssamelibrary::MainProtocol::OnAnonComposed> {
  using Request = ::test_protocollayoutssamelibrary::ComposedProtocolOnAnonComposedRequest;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayoutssamelibrary::MainProtocol::OneWayNamedComposed> {
  using Request = ::test_protocollayoutssamelibrary::TablePayload;

  using Completer = fidl::Completer<>;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposed> {
  using Request = ::test_protocollayoutssamelibrary::UnionPayload;

  using Response = ::test_protocollayoutssamelibrary::TablePayload;

  using Completer = fidl::Completer<::fidl::internal::NaturalCompleterBase<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposed>>;
  using ResultCallback =
      ::fit::callback<void(::fidl::Result<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposed>&)>;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposedWithError> {
  using Request = ::test_protocollayoutssamelibrary::TablePayload;

  using Response = ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayNamedComposedWithErrorResult;

  using Completer = fidl::Completer<::fidl::internal::NaturalCompleterBase<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposedWithError>>;
  using ResultCallback =
      ::fit::callback<void(::fidl::Result<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposedWithError>&)>;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayoutssamelibrary::MainProtocol::OnNamedComposed> {
  using Request = ::test_protocollayoutssamelibrary::UnionPayload;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayoutssamelibrary::MainProtocol::OneWayLocal> {
  using Request = ::test_protocollayoutssamelibrary::TablePayload;

  using Completer = fidl::Completer<>;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocal> {
  using Request = ::test_protocollayoutssamelibrary::UnionPayload;

  using Response = ::test_protocollayoutssamelibrary::TablePayload;

  using Completer = fidl::Completer<::fidl::internal::NaturalCompleterBase<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocal>>;
  using ResultCallback =
      ::fit::callback<void(::fidl::Result<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocal>&)>;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocalWithError> {
  using Request = ::test_protocollayoutssamelibrary::TablePayload;

  using Response = ::test_protocollayoutssamelibrary::MainProtocolTwoWayLocalWithErrorResult;

  using Completer = fidl::Completer<::fidl::internal::NaturalCompleterBase<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocalWithError>>;
  using ResultCallback =
      ::fit::callback<void(::fidl::Result<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocalWithError>&)>;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayoutssamelibrary::MainProtocol::OnLocal> {
  using Request = ::test_protocollayoutssamelibrary::UnionPayload;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayoutssamelibrary::MainProtocol::OneWayAnon> {
  using Request = ::test_protocollayoutssamelibrary::MainProtocolOneWayAnonRequest;

  using Completer = fidl::Completer<>;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnon> {
  using Request = ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonRequest;

  using Response = ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonResponse;

  using Completer = fidl::Completer<::fidl::internal::NaturalCompleterBase<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnon>>;
  using ResultCallback =
      ::fit::callback<void(::fidl::Result<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnon>&)>;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonWithError> {
  using Request = ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorRequest;

  using Response = ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorResult;

  using Completer = fidl::Completer<::fidl::internal::NaturalCompleterBase<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonWithError>>;
  using ResultCallback =
      ::fit::callback<void(::fidl::Result<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonWithError>&)>;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayoutssamelibrary::MainProtocol::OnAnon> {
  using Request = ::test_protocollayoutssamelibrary::MainProtocolOnAnonRequest;
};

#ifdef __Fuchsia__

template <>
class ::fidl::Response<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposed> final : public ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedResponse {
 public:
  using ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedResponse::ComposedProtocolTwoWayAnonComposedResponse;
  Response(::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedResponse v) : ComposedProtocolTwoWayAnonComposedResponse(std::move(v)) {}
};

template <>
class ::fidl::Result<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposed> final : public ::fit::result<::fidl::Error, ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedResponse> {
 public:
  using ::fit::result<::fidl::Error, ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedResponse>::result;

 protected:
  Result() = default;
};

template <>
class ::fidl::Response<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposedWithError> final : public ::fit::result<uint32_t, ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResponse> {
 public:
  using ::fit::result<uint32_t, ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResponse>::result;
  Response(::fit::result<uint32_t, ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResponse> v) : result(std::move(v)) {}
  Response() = delete;
};
template <>
class ::fidl::internal::ResponseMessageConverter<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposedWithError> {
  using DomainObject = ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResult;

 public:
  static DomainObject IntoDomainObject(const ::fidl::Response<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposedWithError>& m) {
    if (m.is_error()) {
      return DomainObject::WithErr(m.error_value());
    } else {
      return DomainObject::WithResponse(std::move(m.value()));
    }
  }
};

template <>
class ::fidl::Result<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposedWithError> final : public ::fit::result<::fidl::ErrorsIn<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposedWithError>, ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResponse> {
 public:
  using ::fit::result<::fidl::ErrorsIn<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposedWithError>, ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResponse>::result;

 protected:
  Result() = default;
};

template <>
class ::fidl::Response<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposed> final : public ::test_protocollayoutssamelibrary::TablePayload {
 public:
  using ::test_protocollayoutssamelibrary::TablePayload::TablePayload;
  Response(::test_protocollayoutssamelibrary::TablePayload v) : TablePayload(std::move(v)) {}
};

template <>
class ::fidl::Result<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposed> final : public ::fit::result<::fidl::Error, ::test_protocollayoutssamelibrary::TablePayload> {
 public:
  using ::fit::result<::fidl::Error, ::test_protocollayoutssamelibrary::TablePayload>::result;

 protected:
  Result() = default;
};

template <>
class ::fidl::Response<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposedWithError> final : public ::fit::result<uint32_t, ::test_protocollayoutssamelibrary::UnionPayload> {
 public:
  using ::fit::result<uint32_t, ::test_protocollayoutssamelibrary::UnionPayload>::result;
  Response(::fit::result<uint32_t, ::test_protocollayoutssamelibrary::UnionPayload> v) : result(std::move(v)) {}
  Response() = delete;
};
template <>
class ::fidl::internal::ResponseMessageConverter<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposedWithError> {
  using DomainObject = ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayNamedComposedWithErrorResult;

 public:
  static DomainObject IntoDomainObject(const ::fidl::Response<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposedWithError>& m) {
    if (m.is_error()) {
      return DomainObject::WithErr(m.error_value());
    } else {
      return DomainObject::WithResponse(std::move(m.value()));
    }
  }
};

template <>
class ::fidl::Result<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposedWithError> final : public ::fit::result<::fidl::ErrorsIn<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposedWithError>, ::test_protocollayoutssamelibrary::UnionPayload> {
 public:
  using ::fit::result<::fidl::ErrorsIn<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposedWithError>, ::test_protocollayoutssamelibrary::UnionPayload>::result;

 protected:
  Result() = default;
};

template <>
class ::fidl::Response<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocal> final : public ::test_protocollayoutssamelibrary::TablePayload {
 public:
  using ::test_protocollayoutssamelibrary::TablePayload::TablePayload;
  Response(::test_protocollayoutssamelibrary::TablePayload v) : TablePayload(std::move(v)) {}
};

template <>
class ::fidl::Result<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocal> final : public ::fit::result<::fidl::Error, ::test_protocollayoutssamelibrary::TablePayload> {
 public:
  using ::fit::result<::fidl::Error, ::test_protocollayoutssamelibrary::TablePayload>::result;

 protected:
  Result() = default;
};

template <>
class ::fidl::Response<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocalWithError> final : public ::fit::result<uint32_t, ::test_protocollayoutssamelibrary::UnionPayload> {
 public:
  using ::fit::result<uint32_t, ::test_protocollayoutssamelibrary::UnionPayload>::result;
  Response(::fit::result<uint32_t, ::test_protocollayoutssamelibrary::UnionPayload> v) : result(std::move(v)) {}
  Response() = delete;
};
template <>
class ::fidl::internal::ResponseMessageConverter<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocalWithError> {
  using DomainObject = ::test_protocollayoutssamelibrary::MainProtocolTwoWayLocalWithErrorResult;

 public:
  static DomainObject IntoDomainObject(const ::fidl::Response<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocalWithError>& m) {
    if (m.is_error()) {
      return DomainObject::WithErr(m.error_value());
    } else {
      return DomainObject::WithResponse(std::move(m.value()));
    }
  }
};

template <>
class ::fidl::Result<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocalWithError> final : public ::fit::result<::fidl::ErrorsIn<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocalWithError>, ::test_protocollayoutssamelibrary::UnionPayload> {
 public:
  using ::fit::result<::fidl::ErrorsIn<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocalWithError>, ::test_protocollayoutssamelibrary::UnionPayload>::result;

 protected:
  Result() = default;
};

template <>
class ::fidl::Response<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnon> final : public ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonResponse {
 public:
  using ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonResponse::MainProtocolTwoWayAnonResponse;
  Response(::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonResponse v) : MainProtocolTwoWayAnonResponse(std::move(v)) {}
};

template <>
class ::fidl::Result<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnon> final : public ::fit::result<::fidl::Error, ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonResponse> {
 public:
  using ::fit::result<::fidl::Error, ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonResponse>::result;

 protected:
  Result() = default;
};

template <>
class ::fidl::Response<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonWithError> final : public ::fit::result<uint32_t, ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorResponse> {
 public:
  using ::fit::result<uint32_t, ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorResponse>::result;
  Response(::fit::result<uint32_t, ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorResponse> v) : result(std::move(v)) {}
  Response() = delete;
};
template <>
class ::fidl::internal::ResponseMessageConverter<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonWithError> {
  using DomainObject = ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorResult;

 public:
  static DomainObject IntoDomainObject(const ::fidl::Response<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonWithError>& m) {
    if (m.is_error()) {
      return DomainObject::WithErr(m.error_value());
    } else {
      return DomainObject::WithResponse(std::move(m.value()));
    }
  }
};

template <>
class ::fidl::Result<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonWithError> final : public ::fit::result<::fidl::ErrorsIn<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonWithError>, ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorResponse> {
 public:
  using ::fit::result<::fidl::ErrorsIn<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonWithError>, ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorResponse>::result;

 protected:
  Result() = default;
};

template <>
class ::fidl::internal::NaturalClientImpl<::test_protocollayoutssamelibrary::MainProtocol> final : public ::fidl::internal::NaturalClientBase {
 public:
  using NaturalClientBase::NaturalClientBase;
  ::fidl::internal::NaturalThenable<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposed> TwoWayAnonComposed(const ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposed>& request) const;

  ::fidl::internal::NaturalThenable<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposedWithError> TwoWayAnonComposedWithError(const ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposedWithError>& request) const;

  ::fidl::internal::NaturalThenable<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposed> TwoWayNamedComposed(const ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposed>& request) const;

  ::fidl::internal::NaturalThenable<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposedWithError> TwoWayNamedComposedWithError(const ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposedWithError>& request) const;

  ::fidl::internal::NaturalThenable<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocal> TwoWayLocal(const ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocal>& request) const;

  ::fidl::internal::NaturalThenable<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocalWithError> TwoWayLocalWithError(const ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocalWithError>& request) const;

  ::fidl::internal::NaturalThenable<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnon> TwoWayAnon(const ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnon>& request) const;

  ::fidl::internal::NaturalThenable<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonWithError> TwoWayAnonWithError(const ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonWithError>& request) const;

  ::fit::result<::fidl::OneWayError> OneWayAnonComposed(const ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::OneWayAnonComposed>& request) const;

  ::fit::result<::fidl::OneWayError> OneWayNamedComposed(const ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::OneWayNamedComposed>& request) const;

  ::fit::result<::fidl::OneWayError> OneWayLocal(const ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::OneWayLocal>& request) const;

  ::fit::result<::fidl::OneWayError> OneWayAnon(const ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::OneWayAnon>& request) const;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
class ::fidl::internal::NaturalSyncClientImpl<::test_protocollayoutssamelibrary::MainProtocol> final
    : public ::fidl::internal::SyncEndpointManagedVeneer<::fidl::internal::NaturalSyncClientImpl<::test_protocollayoutssamelibrary::MainProtocol>> {
 public:
  ::fidl::Result<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposed> TwoWayAnonComposed(const ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposed>& request);

  ::fidl::Result<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposedWithError> TwoWayAnonComposedWithError(const ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposedWithError>& request);

  ::fidl::Result<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposed> TwoWayNamedComposed(const ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposed>& request);

  ::fidl::Result<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposedWithError> TwoWayNamedComposedWithError(const ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposedWithError>& request);

  ::fidl::Result<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocal> TwoWayLocal(const ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocal>& request);

  ::fidl::Result<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocalWithError> TwoWayLocalWithError(const ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocalWithError>& request);

  ::fidl::Result<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnon> TwoWayAnon(const ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnon>& request);

  ::fidl::Result<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonWithError> TwoWayAnonWithError(const ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonWithError>& request);

  ::fit::result<::fidl::OneWayError> OneWayAnonComposed(const ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::OneWayAnonComposed>& request);

  ::fit::result<::fidl::OneWayError> OneWayNamedComposed(const ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::OneWayNamedComposed>& request);

  ::fit::result<::fidl::OneWayError> OneWayLocal(const ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::OneWayLocal>& request);

  ::fit::result<::fidl::OneWayError> OneWayAnon(const ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::OneWayAnon>& request);

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

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
class ::fidl::internal::NaturalEventHandlerInterface<::test_protocollayoutssamelibrary::MainProtocol> : public ::fidl::internal::BaseEventHandlerInterface {
 public:
  NaturalEventHandlerInterface() = default;
  virtual ~NaturalEventHandlerInterface() = default;
  virtual void OnAnonComposed(::fidl::Event<::test_protocollayoutssamelibrary::MainProtocol::OnAnonComposed>&) = 0;
  virtual void OnNamedComposed(::fidl::Event<::test_protocollayoutssamelibrary::MainProtocol::OnNamedComposed>&) = 0;
  virtual void OnLocal(::fidl::Event<::test_protocollayoutssamelibrary::MainProtocol::OnLocal>&) = 0;
  virtual void OnAnon(::fidl::Event<::test_protocollayoutssamelibrary::MainProtocol::OnAnon>&) = 0;
};

template <>
class ::fidl::AsyncEventHandler<::test_protocollayoutssamelibrary::MainProtocol>
    : public ::fidl::internal::NaturalEventHandlerInterface<::test_protocollayoutssamelibrary::MainProtocol>, public ::fidl::internal::AsyncEventHandler {
 public:
  AsyncEventHandler() = default;
  void OnAnonComposed(::fidl::Event<::test_protocollayoutssamelibrary::MainProtocol::OnAnonComposed>&) override {}
  void OnNamedComposed(::fidl::Event<::test_protocollayoutssamelibrary::MainProtocol::OnNamedComposed>&) override {}
  void OnLocal(::fidl::Event<::test_protocollayoutssamelibrary::MainProtocol::OnLocal>&) override {}
  void OnAnon(::fidl::Event<::test_protocollayoutssamelibrary::MainProtocol::OnAnon>&) override {}
};

template <>
class ::fidl::SyncEventHandler<::test_protocollayoutssamelibrary::MainProtocol>
    : public ::fidl::internal::NaturalEventHandlerInterface<::test_protocollayoutssamelibrary::MainProtocol>, 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_protocollayoutssamelibrary::MainProtocol> client_end);
};

template <>
class ::fidl::internal::NaturalEventDispatcher<::test_protocollayoutssamelibrary::MainProtocol> final : public ::fidl::internal::IncomingEventDispatcher<::fidl::internal::NaturalEventHandlerInterface<::test_protocollayoutssamelibrary::MainProtocol>> {
 public:
  explicit NaturalEventDispatcher(::fidl::internal::NaturalEventHandlerInterface<::test_protocollayoutssamelibrary::MainProtocol>* event_handler)
      : IncomingEventDispatcher(event_handler) {}
  ::fidl::Status DispatchEvent(
      ::fidl::IncomingHeaderAndMessage& msg,
      internal::MessageStorageViewBase* storage_view) override;
};

#endif  // __Fuchsia__

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

  ::fit::result<::fidl::OneWayError> OnAnonComposed(const ::test_protocollayoutssamelibrary::ComposedProtocolOnAnonComposedRequest& payload);

  ::fit::result<::fidl::OneWayError> OnNamedComposed(const ::test_protocollayoutssamelibrary::UnionPayload& payload);

  ::fit::result<::fidl::OneWayError> OnLocal(const ::test_protocollayoutssamelibrary::UnionPayload& payload);

  ::fit::result<::fidl::OneWayError> OnAnon(const ::test_protocollayoutssamelibrary::MainProtocolOnAnonRequest& payload);
};

template <>
class ::fidl::internal::NaturalEventSender<::test_protocollayoutssamelibrary::MainProtocol>
    : public ::fidl::internal::SyncEndpointManagedVeneer<::fidl::internal::NaturalEventSender<::test_protocollayoutssamelibrary::MainProtocol>> {
 public:
  using SyncEndpointManagedVeneer::SyncEndpointManagedVeneer;

  ::fit::result<::fidl::OneWayError> OnAnonComposed(const ::test_protocollayoutssamelibrary::ComposedProtocolOnAnonComposedRequest& payload);

  ::fit::result<::fidl::OneWayError> OnNamedComposed(const ::test_protocollayoutssamelibrary::UnionPayload& payload);

  ::fit::result<::fidl::OneWayError> OnLocal(const ::test_protocollayoutssamelibrary::UnionPayload& payload);

  ::fit::result<::fidl::OneWayError> OnAnon(const ::test_protocollayoutssamelibrary::MainProtocolOnAnonRequest& payload);
};

#endif  // __Fuchsia__

template <>
class ::fidl::internal::NaturalCompleterBase<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposed> : public ::fidl::CompleterBase {
 public:
  void Reply(const ::fidl::Response<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposed>& response);

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

template <>
class ::fidl::internal::NaturalCompleterBase<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposedWithError> : public ::fidl::CompleterBase {
 public:
  void Reply(const ::fidl::Response<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposedWithError>& response);

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

template <>
class ::fidl::internal::NaturalCompleterBase<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposed> : public ::fidl::CompleterBase {
 public:
  void Reply(const ::fidl::Response<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposed>& response);

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

template <>
class ::fidl::internal::NaturalCompleterBase<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposedWithError> : public ::fidl::CompleterBase {
 public:
  void Reply(const ::fidl::Response<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposedWithError>& response);

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

template <>
class ::fidl::internal::NaturalCompleterBase<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocal> : public ::fidl::CompleterBase {
 public:
  void Reply(const ::fidl::Response<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocal>& response);

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

template <>
class ::fidl::internal::NaturalCompleterBase<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocalWithError> : public ::fidl::CompleterBase {
 public:
  void Reply(const ::fidl::Response<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocalWithError>& response);

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

template <>
class ::fidl::internal::NaturalCompleterBase<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnon> : public ::fidl::CompleterBase {
 public:
  void Reply(const ::fidl::Response<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnon>& response);

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

template <>
class ::fidl::internal::NaturalCompleterBase<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonWithError> : public ::fidl::CompleterBase {
 public:
  void Reply(const ::fidl::Response<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonWithError>& response);

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

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

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

  using Handler = fidl::ProtocolHandler<::test_protocollayoutssamelibrary::MainProtocol>;

  using OneWayAnonComposedRequest = ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::OneWayAnonComposed>;
  using OneWayAnonComposedCompleter = ::fidl::internal::NaturalCompleter<::test_protocollayoutssamelibrary::MainProtocol::OneWayAnonComposed>;

  virtual void OneWayAnonComposed(OneWayAnonComposedRequest& request,
                                  OneWayAnonComposedCompleter::Sync& completer) = 0;

  using TwoWayAnonComposedRequest = ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposed>;
  using TwoWayAnonComposedCompleter = ::fidl::internal::NaturalCompleter<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposed>;

  virtual void TwoWayAnonComposed(TwoWayAnonComposedRequest& request,
                                  TwoWayAnonComposedCompleter::Sync& completer) = 0;

  using TwoWayAnonComposedWithErrorRequest = ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposedWithError>;
  using TwoWayAnonComposedWithErrorCompleter = ::fidl::internal::NaturalCompleter<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonComposedWithError>;

  virtual void TwoWayAnonComposedWithError(TwoWayAnonComposedWithErrorRequest& request,
                                           TwoWayAnonComposedWithErrorCompleter::Sync& completer) = 0;

  using OneWayNamedComposedRequest = ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::OneWayNamedComposed>;
  using OneWayNamedComposedCompleter = ::fidl::internal::NaturalCompleter<::test_protocollayoutssamelibrary::MainProtocol::OneWayNamedComposed>;

  virtual void OneWayNamedComposed(OneWayNamedComposedRequest& request,
                                   OneWayNamedComposedCompleter::Sync& completer) = 0;

  using TwoWayNamedComposedRequest = ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposed>;
  using TwoWayNamedComposedCompleter = ::fidl::internal::NaturalCompleter<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposed>;

  virtual void TwoWayNamedComposed(TwoWayNamedComposedRequest& request,
                                   TwoWayNamedComposedCompleter::Sync& completer) = 0;

  using TwoWayNamedComposedWithErrorRequest = ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposedWithError>;
  using TwoWayNamedComposedWithErrorCompleter = ::fidl::internal::NaturalCompleter<::test_protocollayoutssamelibrary::MainProtocol::TwoWayNamedComposedWithError>;

  virtual void TwoWayNamedComposedWithError(TwoWayNamedComposedWithErrorRequest& request,
                                            TwoWayNamedComposedWithErrorCompleter::Sync& completer) = 0;

  using OneWayLocalRequest = ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::OneWayLocal>;
  using OneWayLocalCompleter = ::fidl::internal::NaturalCompleter<::test_protocollayoutssamelibrary::MainProtocol::OneWayLocal>;

  virtual void OneWayLocal(OneWayLocalRequest& request,
                           OneWayLocalCompleter::Sync& completer) = 0;

  using TwoWayLocalRequest = ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocal>;
  using TwoWayLocalCompleter = ::fidl::internal::NaturalCompleter<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocal>;

  virtual void TwoWayLocal(TwoWayLocalRequest& request,
                           TwoWayLocalCompleter::Sync& completer) = 0;

  using TwoWayLocalWithErrorRequest = ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocalWithError>;
  using TwoWayLocalWithErrorCompleter = ::fidl::internal::NaturalCompleter<::test_protocollayoutssamelibrary::MainProtocol::TwoWayLocalWithError>;

  virtual void TwoWayLocalWithError(TwoWayLocalWithErrorRequest& request,
                                    TwoWayLocalWithErrorCompleter::Sync& completer) = 0;

  using OneWayAnonRequest = ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::OneWayAnon>;
  using OneWayAnonCompleter = ::fidl::internal::NaturalCompleter<::test_protocollayoutssamelibrary::MainProtocol::OneWayAnon>;

  virtual void OneWayAnon(OneWayAnonRequest& request,
                          OneWayAnonCompleter::Sync& completer) = 0;

  using TwoWayAnonRequest = ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnon>;
  using TwoWayAnonCompleter = ::fidl::internal::NaturalCompleter<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnon>;

  virtual void TwoWayAnon(TwoWayAnonRequest& request,
                          TwoWayAnonCompleter::Sync& completer) = 0;

  using TwoWayAnonWithErrorRequest = ::fidl::Request<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonWithError>;
  using TwoWayAnonWithErrorCompleter = ::fidl::internal::NaturalCompleter<::test_protocollayoutssamelibrary::MainProtocol::TwoWayAnonWithError>;

  virtual void TwoWayAnonWithError(TwoWayAnonWithErrorRequest& request,
                                   TwoWayAnonWithErrorCompleter::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_protocollayoutssamelibrary::MainProtocol> 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_protocollayoutssamelibrary::MainProtocol> final {
  NaturalServerDispatcher() = delete;
  static void Dispatch(::fidl::Server<::test_protocollayoutssamelibrary::MainProtocol>* 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
