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

// fidl_experiment = output_index_json

#pragma once

#include <fidl/test.protocollayouts.imported/cpp/natural_messaging.h>
#include <fidl/test.protocollayouts/cpp/markers.h>
#include <fidl/test.protocollayouts/cpp/natural_types.h>
#include <fidl/test.protocollayouts/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_protocollayouts::MainProtocol::OneWayAnonComposed> {
  using Request = ::test_protocollayouts_imported::ComposedProtocolOneWayAnonComposedRequest;

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

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

  using Response = ::test_protocollayouts_imported::ComposedProtocolTwoWayAnonComposedResponse;

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

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

  using Response = ::test_protocollayouts_imported::ComposedProtocolTwoWayAnonComposedWithErrorResult;

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

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

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayouts::MainProtocol::OneWayNamedComposed> {
  using Request = ::test_protocollayouts_imported::ImportTablePayload;

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

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayouts::MainProtocol::TwoWayNamedComposed> {
  using Request = ::test_protocollayouts_imported::ImportUnionPayload;

  using Response = ::test_protocollayouts_imported::ImportTablePayload;

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

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> {
  using Request = ::test_protocollayouts_imported::ImportTablePayload;

  using Response = ::test_protocollayouts_imported::ComposedProtocolTwoWayNamedComposedWithErrorResult;

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

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayouts::MainProtocol::OnNamedComposed> {
  using Request = ::test_protocollayouts_imported::ImportUnionPayload;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayouts::MainProtocol::OneWayImport> {
  using Request = ::test_protocollayouts_imported::ImportTablePayload;

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

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayouts::MainProtocol::TwoWayImport> {
  using Request = ::test_protocollayouts_imported::ImportUnionPayload;

  using Response = ::test_protocollayouts_imported::ImportTablePayload;

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

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayouts::MainProtocol::TwoWayImportWithError> {
  using Request = ::test_protocollayouts_imported::ImportTablePayload;

  using Response = ::test_protocollayouts::MainProtocolTwoWayImportWithErrorResult;

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

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayouts::MainProtocol::OnImport> {
  using Request = ::test_protocollayouts_imported::ImportUnionPayload;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayouts::MainProtocol::OneWayLocal> {
  using Request = ::test_protocollayouts::LocalTablePayload;

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

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayouts::MainProtocol::TwoWayLocal> {
  using Request = ::test_protocollayouts::LocalUnionPayload;

  using Response = ::test_protocollayouts::LocalTablePayload;

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

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayouts::MainProtocol::TwoWayLocalWithError> {
  using Request = ::test_protocollayouts::LocalTablePayload;

  using Response = ::test_protocollayouts::MainProtocolTwoWayLocalWithErrorResult;

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

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

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

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

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

  using Response = ::test_protocollayouts::MainProtocolTwoWayAnonResponse;

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

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

  using Response = ::test_protocollayouts::MainProtocolTwoWayAnonWithErrorResult;

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

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

#ifdef __Fuchsia__

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

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

 protected:
  Result() = default;
};

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

 public:
  static DomainObject IntoDomainObject(const ::fidl::Response<::test_protocollayouts::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_protocollayouts::MainProtocol::TwoWayAnonComposedWithError> final : public ::fit::result<::fidl::ErrorsIn<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>, ::test_protocollayouts_imported::ComposedProtocolTwoWayAnonComposedWithErrorResponse> {
 public:
  using ::fit::result<::fidl::ErrorsIn<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>, ::test_protocollayouts_imported::ComposedProtocolTwoWayAnonComposedWithErrorResponse>::result;

 protected:
  Result() = default;
};

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

template <>
class ::fidl::Result<::test_protocollayouts::MainProtocol::TwoWayNamedComposed> final : public ::fit::result<::fidl::Error, ::test_protocollayouts_imported::ImportTablePayload> {
 public:
  using ::fit::result<::fidl::Error, ::test_protocollayouts_imported::ImportTablePayload>::result;

 protected:
  Result() = default;
};

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

 public:
  static DomainObject IntoDomainObject(const ::fidl::Response<::test_protocollayouts::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_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> final : public ::fit::result<::fidl::ErrorsIn<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>, ::test_protocollayouts_imported::ImportUnionPayload> {
 public:
  using ::fit::result<::fidl::ErrorsIn<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>, ::test_protocollayouts_imported::ImportUnionPayload>::result;

 protected:
  Result() = default;
};

template <>
class ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayImport> final : public ::test_protocollayouts_imported::ImportTablePayload {
 public:
  using ::test_protocollayouts_imported::ImportTablePayload::ImportTablePayload;
  Response(::test_protocollayouts_imported::ImportTablePayload v) : ImportTablePayload(std::move(v)) {}
};

template <>
class ::fidl::Result<::test_protocollayouts::MainProtocol::TwoWayImport> final : public ::fit::result<::fidl::Error, ::test_protocollayouts_imported::ImportTablePayload> {
 public:
  using ::fit::result<::fidl::Error, ::test_protocollayouts_imported::ImportTablePayload>::result;

 protected:
  Result() = default;
};

template <>
class ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayImportWithError> final : public ::fit::result<uint32_t, ::test_protocollayouts_imported::ImportUnionPayload> {
 public:
  using ::fit::result<uint32_t, ::test_protocollayouts_imported::ImportUnionPayload>::result;
  Response(::fit::result<uint32_t, ::test_protocollayouts_imported::ImportUnionPayload> v) : result(std::move(v)) {}
  Response() = delete;
};
template <>
class ::fidl::internal::ResponseMessageConverter<::test_protocollayouts::MainProtocol::TwoWayImportWithError> {
  using DomainObject = ::test_protocollayouts::MainProtocolTwoWayImportWithErrorResult;

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

template <>
class ::fidl::Result<::test_protocollayouts::MainProtocol::TwoWayImportWithError> final : public ::fit::result<::fidl::ErrorsIn<::test_protocollayouts::MainProtocol::TwoWayImportWithError>, ::test_protocollayouts_imported::ImportUnionPayload> {
 public:
  using ::fit::result<::fidl::ErrorsIn<::test_protocollayouts::MainProtocol::TwoWayImportWithError>, ::test_protocollayouts_imported::ImportUnionPayload>::result;

 protected:
  Result() = default;
};

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

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

 protected:
  Result() = default;
};

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

 public:
  static DomainObject IntoDomainObject(const ::fidl::Response<::test_protocollayouts::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_protocollayouts::MainProtocol::TwoWayLocalWithError> final : public ::fit::result<::fidl::ErrorsIn<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>, ::test_protocollayouts::LocalUnionPayload> {
 public:
  using ::fit::result<::fidl::ErrorsIn<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>, ::test_protocollayouts::LocalUnionPayload>::result;

 protected:
  Result() = default;
};

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

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

 protected:
  Result() = default;
};

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

 public:
  static DomainObject IntoDomainObject(const ::fidl::Response<::test_protocollayouts::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_protocollayouts::MainProtocol::TwoWayAnonWithError> final : public ::fit::result<::fidl::ErrorsIn<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>, ::test_protocollayouts::MainProtocolTwoWayAnonWithErrorResponse> {
 public:
  using ::fit::result<::fidl::ErrorsIn<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>, ::test_protocollayouts::MainProtocolTwoWayAnonWithErrorResponse>::result;

 protected:
  Result() = default;
};

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

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

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

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

  ::fidl::internal::NaturalThenable<::test_protocollayouts::MainProtocol::TwoWayImport> TwoWayImport(const ::fidl::Request<::test_protocollayouts::MainProtocol::TwoWayImport>& request) const;

  ::fidl::internal::NaturalThenable<::test_protocollayouts::MainProtocol::TwoWayImportWithError> TwoWayImportWithError(const ::fidl::Request<::test_protocollayouts::MainProtocol::TwoWayImportWithError>& request) const;

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

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

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

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

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

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

  ::fit::result<::fidl::OneWayError> OneWayImport(const ::fidl::Request<::test_protocollayouts::MainProtocol::OneWayImport>& request) const;

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

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

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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

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

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

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

  ::fidl::Result<::test_protocollayouts::MainProtocol::TwoWayImport> TwoWayImport(const ::fidl::Request<::test_protocollayouts::MainProtocol::TwoWayImport>& request);

  ::fidl::Result<::test_protocollayouts::MainProtocol::TwoWayImportWithError> TwoWayImportWithError(const ::fidl::Request<::test_protocollayouts::MainProtocol::TwoWayImportWithError>& request);

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

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

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

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

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

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

  ::fit::result<::fidl::OneWayError> OneWayImport(const ::fidl::Request<::test_protocollayouts::MainProtocol::OneWayImport>& request);

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

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

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

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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

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

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

template <>
class ::fidl::internal::NaturalEventDispatcher<::test_protocollayouts::MainProtocol> final : public ::fidl::internal::IncomingEventDispatcher<::fidl::internal::NaturalEventHandlerInterface<::test_protocollayouts::MainProtocol>> {
 public:
  explicit NaturalEventDispatcher(::fidl::internal::NaturalEventHandlerInterface<::test_protocollayouts::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_protocollayouts::MainProtocol> : public ::fidl::internal::WeakEventSenderBase {
 public:
  using WeakEventSenderBase::WeakEventSenderBase;

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

  ::fit::result<::fidl::OneWayError> OnNamedComposed(const ::test_protocollayouts_imported::ImportUnionPayload& payload);

  ::fit::result<::fidl::OneWayError> OnImport(const ::test_protocollayouts_imported::ImportUnionPayload& payload);

  ::fit::result<::fidl::OneWayError> OnLocal(const ::test_protocollayouts::LocalUnionPayload& payload);

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

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

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

  ::fit::result<::fidl::OneWayError> OnNamedComposed(const ::test_protocollayouts_imported::ImportUnionPayload& payload);

  ::fit::result<::fidl::OneWayError> OnImport(const ::test_protocollayouts_imported::ImportUnionPayload& payload);

  ::fit::result<::fidl::OneWayError> OnLocal(const ::test_protocollayouts::LocalUnionPayload& payload);

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

#endif  // __Fuchsia__

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  using OneWayImportRequest = ::fidl::Request<::test_protocollayouts::MainProtocol::OneWayImport>;
  using OneWayImportCompleter = ::fidl::internal::NaturalCompleter<::test_protocollayouts::MainProtocol::OneWayImport>;

  virtual void OneWayImport(OneWayImportRequest& request,
                            OneWayImportCompleter::Sync& completer) = 0;

  using TwoWayImportRequest = ::fidl::Request<::test_protocollayouts::MainProtocol::TwoWayImport>;
  using TwoWayImportCompleter = ::fidl::internal::NaturalCompleter<::test_protocollayouts::MainProtocol::TwoWayImport>;

  virtual void TwoWayImport(TwoWayImportRequest& request,
                            TwoWayImportCompleter::Sync& completer) = 0;

  using TwoWayImportWithErrorRequest = ::fidl::Request<::test_protocollayouts::MainProtocol::TwoWayImportWithError>;
  using TwoWayImportWithErrorCompleter = ::fidl::internal::NaturalCompleter<::test_protocollayouts::MainProtocol::TwoWayImportWithError>;

  virtual void TwoWayImportWithError(TwoWayImportWithErrorRequest& request,
                                     TwoWayImportWithErrorCompleter::Sync& completer) = 0;

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

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

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

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

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

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

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

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

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

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

  using TwoWayAnonWithErrorRequest = ::fidl::Request<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>;
  using TwoWayAnonWithErrorCompleter = ::fidl::internal::NaturalCompleter<::test_protocollayouts::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_protocollayouts::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_protocollayouts::MainProtocol> final {
  NaturalServerDispatcher() = delete;
  static void Dispatch(::fidl::Server<::test_protocollayouts::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__

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayouts::OpenProtocol::FlexibleOneWay> {
  using Request = ::test_protocollayouts_imported::ComposedOpenProtocolFlexibleOneWayRequest;

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

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError> {
  using Request = ::test_protocollayouts_imported::ComposedOpenProtocolFlexibleTwoWayNoErrorRequest;

  using Response = ::test_protocollayouts_imported::ComposedOpenProtocolFlexibleTwoWayNoErrorResult;

  using Completer = fidl::Completer<::fidl::internal::NaturalCompleterBase<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>>;
  using ResultCallback =
      ::fit::callback<void(::fidl::Result<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>&)>;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError> {
  using Request = ::test_protocollayouts_imported::ComposedOpenProtocolFlexibleTwoWayWithErrorRequest;

  using Response = ::test_protocollayouts_imported::ComposedOpenProtocolFlexibleTwoWayWithErrorResult;

  using Completer = fidl::Completer<::fidl::internal::NaturalCompleterBase<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>>;
  using ResultCallback =
      ::fit::callback<void(::fidl::Result<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>&)>;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayouts::OpenProtocol::FlexibleEvent> {
  using Request = ::test_protocollayouts_imported::ComposedOpenProtocolFlexibleEventRequest;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayouts::OpenProtocol::StrictOneWay> {
  using Request = ::test_protocollayouts_imported::ComposedOpenProtocolStrictOneWayRequest;

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

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> {
  using Request = ::test_protocollayouts_imported::ComposedOpenProtocolStrictTwoWayNoErrorRequest;

  using Response = ::test_protocollayouts_imported::ComposedOpenProtocolStrictTwoWayNoErrorResponse;

  using Completer = fidl::Completer<::fidl::internal::NaturalCompleterBase<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>>;
  using ResultCallback =
      ::fit::callback<void(::fidl::Result<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>&)>;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> {
  using Request = ::test_protocollayouts_imported::ComposedOpenProtocolStrictTwoWayWithErrorRequest;

  using Response = ::test_protocollayouts_imported::ComposedOpenProtocolStrictTwoWayWithErrorResult;

  using Completer = fidl::Completer<::fidl::internal::NaturalCompleterBase<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>>;
  using ResultCallback =
      ::fit::callback<void(::fidl::Result<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>&)>;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayouts::OpenProtocol::StrictEvent> {
  using Request = ::test_protocollayouts_imported::ComposedOpenProtocolStrictEventRequest;
};

template <>
struct ::fidl::internal::NaturalMethodTypes<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload> {
  using Request = ::test_protocollayouts_imported::ImportStructPayload;

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

#ifdef __Fuchsia__

template <>
class ::fidl::Response<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError> final : public ::test_protocollayouts_imported::ComposedOpenProtocolFlexibleTwoWayNoErrorResponse {
 public:
  using ::test_protocollayouts_imported::ComposedOpenProtocolFlexibleTwoWayNoErrorResponse::ComposedOpenProtocolFlexibleTwoWayNoErrorResponse;
  Response(::test_protocollayouts_imported::ComposedOpenProtocolFlexibleTwoWayNoErrorResponse v) : ComposedOpenProtocolFlexibleTwoWayNoErrorResponse(std::move(v)) {}
};
template <>
class ::fidl::internal::ResponseMessageConverter<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError> {
  using DomainObject = ::test_protocollayouts_imported::ComposedOpenProtocolFlexibleTwoWayNoErrorResult;

 public:
  static DomainObject IntoDomainObject(const ::fidl::Response<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>& m) {
    return DomainObject::WithResponse(std::move(m));
  }
};

template <>
class ::fidl::Result<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError> final : public ::fit::result<::fidl::Error, ::test_protocollayouts_imported::ComposedOpenProtocolFlexibleTwoWayNoErrorResponse> {
 public:
  using ::fit::result<::fidl::Error, ::test_protocollayouts_imported::ComposedOpenProtocolFlexibleTwoWayNoErrorResponse>::result;

 protected:
  Result() = default;
};

template <>
class ::fidl::Response<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError> final : public ::fit::result<int32_t, ::test_protocollayouts_imported::ComposedOpenProtocolFlexibleTwoWayWithErrorResponse> {
 public:
  using ::fit::result<int32_t, ::test_protocollayouts_imported::ComposedOpenProtocolFlexibleTwoWayWithErrorResponse>::result;
  Response(::fit::result<int32_t, ::test_protocollayouts_imported::ComposedOpenProtocolFlexibleTwoWayWithErrorResponse> v) : result(std::move(v)) {}
  Response() = delete;
};
template <>
class ::fidl::internal::ResponseMessageConverter<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError> {
  using DomainObject = ::test_protocollayouts_imported::ComposedOpenProtocolFlexibleTwoWayWithErrorResult;

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

template <>
class ::fidl::Result<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError> final : public ::fit::result<::fidl::ErrorsIn<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>, ::test_protocollayouts_imported::ComposedOpenProtocolFlexibleTwoWayWithErrorResponse> {
 public:
  using ::fit::result<::fidl::ErrorsIn<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>, ::test_protocollayouts_imported::ComposedOpenProtocolFlexibleTwoWayWithErrorResponse>::result;

 protected:
  Result() = default;
};

template <>
class ::fidl::Response<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> final : public ::test_protocollayouts_imported::ComposedOpenProtocolStrictTwoWayNoErrorResponse {
 public:
  using ::test_protocollayouts_imported::ComposedOpenProtocolStrictTwoWayNoErrorResponse::ComposedOpenProtocolStrictTwoWayNoErrorResponse;
  Response(::test_protocollayouts_imported::ComposedOpenProtocolStrictTwoWayNoErrorResponse v) : ComposedOpenProtocolStrictTwoWayNoErrorResponse(std::move(v)) {}
};

template <>
class ::fidl::Result<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> final : public ::fit::result<::fidl::Error, ::test_protocollayouts_imported::ComposedOpenProtocolStrictTwoWayNoErrorResponse> {
 public:
  using ::fit::result<::fidl::Error, ::test_protocollayouts_imported::ComposedOpenProtocolStrictTwoWayNoErrorResponse>::result;

 protected:
  Result() = default;
};

template <>
class ::fidl::Response<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> final : public ::fit::result<int32_t, ::test_protocollayouts_imported::ComposedOpenProtocolStrictTwoWayWithErrorResponse> {
 public:
  using ::fit::result<int32_t, ::test_protocollayouts_imported::ComposedOpenProtocolStrictTwoWayWithErrorResponse>::result;
  Response(::fit::result<int32_t, ::test_protocollayouts_imported::ComposedOpenProtocolStrictTwoWayWithErrorResponse> v) : result(std::move(v)) {}
  Response() = delete;
};
template <>
class ::fidl::internal::ResponseMessageConverter<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> {
  using DomainObject = ::test_protocollayouts_imported::ComposedOpenProtocolStrictTwoWayWithErrorResult;

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

template <>
class ::fidl::Result<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> final : public ::fit::result<::fidl::ErrorsIn<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>, ::test_protocollayouts_imported::ComposedOpenProtocolStrictTwoWayWithErrorResponse> {
 public:
  using ::fit::result<::fidl::ErrorsIn<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>, ::test_protocollayouts_imported::ComposedOpenProtocolStrictTwoWayWithErrorResponse>::result;

 protected:
  Result() = default;
};

template <>
class ::fidl::internal::NaturalClientImpl<::test_protocollayouts::OpenProtocol> final : public ::fidl::internal::NaturalClientBase {
 public:
  using NaturalClientBase::NaturalClientBase;
  ::fidl::internal::NaturalThenable<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError> FlexibleTwoWayNoError(const ::fidl::Request<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>& request) const;

  ::fidl::internal::NaturalThenable<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError> FlexibleTwoWayWithError(const ::fidl::Request<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>& request) const;

  ::fidl::internal::NaturalThenable<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> StrictTwoWayNoError(const ::fidl::Request<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>& request) const;

  ::fidl::internal::NaturalThenable<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> StrictTwoWayWithError(const ::fidl::Request<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>& request) const;

  ::fit::result<::fidl::OneWayError> FlexibleOneWay(const ::fidl::Request<::test_protocollayouts::OpenProtocol::FlexibleOneWay>& request) const;

  ::fit::result<::fidl::OneWayError> StrictOneWay(const ::fidl::Request<::test_protocollayouts::OpenProtocol::StrictOneWay>& request) const;

  ::fit::result<::fidl::OneWayError> FlexibleOneWayNamedPayload(const ::fidl::Request<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload>& request) const;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
class ::fidl::internal::NaturalSyncClientImpl<::test_protocollayouts::OpenProtocol> final
    : public ::fidl::internal::SyncEndpointManagedVeneer<::fidl::internal::NaturalSyncClientImpl<::test_protocollayouts::OpenProtocol>> {
 public:
  ::fidl::Result<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError> FlexibleTwoWayNoError(const ::fidl::Request<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>& request);

  ::fidl::Result<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError> FlexibleTwoWayWithError(const ::fidl::Request<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>& request);

  ::fidl::Result<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> StrictTwoWayNoError(const ::fidl::Request<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>& request);

  ::fidl::Result<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> StrictTwoWayWithError(const ::fidl::Request<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>& request);

  ::fit::result<::fidl::OneWayError> FlexibleOneWay(const ::fidl::Request<::test_protocollayouts::OpenProtocol::FlexibleOneWay>& request);

  ::fit::result<::fidl::OneWayError> StrictOneWay(const ::fidl::Request<::test_protocollayouts::OpenProtocol::StrictOneWay>& request);

  ::fit::result<::fidl::OneWayError> FlexibleOneWayNamedPayload(const ::fidl::Request<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload>& request);

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

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
class ::fidl::internal::NaturalEventHandlerInterface<::test_protocollayouts::OpenProtocol> : public ::fidl::internal::BaseEventHandlerInterface, public ::fidl::UnknownEventHandler<::test_protocollayouts::OpenProtocol> {
 public:
  NaturalEventHandlerInterface() = default;
  virtual ~NaturalEventHandlerInterface() = default;
  virtual void FlexibleEvent(::fidl::Event<::test_protocollayouts::OpenProtocol::FlexibleEvent>&) = 0;
  virtual void StrictEvent(::fidl::Event<::test_protocollayouts::OpenProtocol::StrictEvent>&) = 0;
};

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

template <>
class ::fidl::SyncEventHandler<::test_protocollayouts::OpenProtocol>
    : public ::fidl::internal::NaturalEventHandlerInterface<::test_protocollayouts::OpenProtocol>, 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_protocollayouts::OpenProtocol> client_end);
};

template <>
class ::fidl::internal::NaturalEventDispatcher<::test_protocollayouts::OpenProtocol> final : public ::fidl::internal::IncomingEventDispatcher<::fidl::internal::NaturalEventHandlerInterface<::test_protocollayouts::OpenProtocol>> {
 public:
  explicit NaturalEventDispatcher(::fidl::internal::NaturalEventHandlerInterface<::test_protocollayouts::OpenProtocol>* 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_protocollayouts::OpenProtocol> : public ::fidl::internal::WeakEventSenderBase {
 public:
  using WeakEventSenderBase::WeakEventSenderBase;

  ::fit::result<::fidl::OneWayError> FlexibleEvent(const ::test_protocollayouts_imported::ComposedOpenProtocolFlexibleEventRequest& payload);

  ::fit::result<::fidl::OneWayError> StrictEvent(const ::test_protocollayouts_imported::ComposedOpenProtocolStrictEventRequest& payload);
};

template <>
class ::fidl::internal::NaturalEventSender<::test_protocollayouts::OpenProtocol>
    : public ::fidl::internal::SyncEndpointManagedVeneer<::fidl::internal::NaturalEventSender<::test_protocollayouts::OpenProtocol>> {
 public:
  using SyncEndpointManagedVeneer::SyncEndpointManagedVeneer;

  ::fit::result<::fidl::OneWayError> FlexibleEvent(const ::test_protocollayouts_imported::ComposedOpenProtocolFlexibleEventRequest& payload);

  ::fit::result<::fidl::OneWayError> StrictEvent(const ::test_protocollayouts_imported::ComposedOpenProtocolStrictEventRequest& payload);
};

#endif  // __Fuchsia__

template <>
class ::fidl::internal::NaturalCompleterBase<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError> : public ::fidl::CompleterBase {
 public:
  void Reply(const ::fidl::Response<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>& response);

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

template <>
class ::fidl::internal::NaturalCompleterBase<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError> : public ::fidl::CompleterBase {
 public:
  void Reply(const ::fidl::Response<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>& response);

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

template <>
class ::fidl::internal::NaturalCompleterBase<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> : public ::fidl::CompleterBase {
 public:
  void Reply(const ::fidl::Response<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>& response);

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

template <>
class ::fidl::internal::NaturalCompleterBase<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> : public ::fidl::CompleterBase {
 public:
  void Reply(const ::fidl::Response<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>& response);

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

template <>
class ::fidl::Server<::test_protocollayouts::OpenProtocol> : public ::fidl::internal::IncomingMessageDispatcher, public ::fidl::UnknownMethodHandler<::test_protocollayouts::OpenProtocol> {
 public:
  Server() = default;
  virtual ~Server() = default;

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

  using Handler = fidl::ProtocolHandler<::test_protocollayouts::OpenProtocol>;

  using FlexibleOneWayRequest = ::fidl::Request<::test_protocollayouts::OpenProtocol::FlexibleOneWay>;
  using FlexibleOneWayCompleter = ::fidl::internal::NaturalCompleter<::test_protocollayouts::OpenProtocol::FlexibleOneWay>;

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

  using FlexibleTwoWayNoErrorRequest = ::fidl::Request<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>;
  using FlexibleTwoWayNoErrorCompleter = ::fidl::internal::NaturalCompleter<::test_protocollayouts::OpenProtocol::FlexibleTwoWayNoError>;

  virtual void FlexibleTwoWayNoError(FlexibleTwoWayNoErrorRequest& request,
                                     FlexibleTwoWayNoErrorCompleter::Sync& completer) = 0;

  using FlexibleTwoWayWithErrorRequest = ::fidl::Request<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>;
  using FlexibleTwoWayWithErrorCompleter = ::fidl::internal::NaturalCompleter<::test_protocollayouts::OpenProtocol::FlexibleTwoWayWithError>;

  virtual void FlexibleTwoWayWithError(FlexibleTwoWayWithErrorRequest& request,
                                       FlexibleTwoWayWithErrorCompleter::Sync& completer) = 0;

  using StrictOneWayRequest = ::fidl::Request<::test_protocollayouts::OpenProtocol::StrictOneWay>;
  using StrictOneWayCompleter = ::fidl::internal::NaturalCompleter<::test_protocollayouts::OpenProtocol::StrictOneWay>;

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

  using StrictTwoWayNoErrorRequest = ::fidl::Request<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>;
  using StrictTwoWayNoErrorCompleter = ::fidl::internal::NaturalCompleter<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>;

  virtual void StrictTwoWayNoError(StrictTwoWayNoErrorRequest& request,
                                   StrictTwoWayNoErrorCompleter::Sync& completer) = 0;

  using StrictTwoWayWithErrorRequest = ::fidl::Request<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>;
  using StrictTwoWayWithErrorCompleter = ::fidl::internal::NaturalCompleter<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>;

  virtual void StrictTwoWayWithError(StrictTwoWayWithErrorRequest& request,
                                     StrictTwoWayWithErrorCompleter::Sync& completer) = 0;

  using FlexibleOneWayNamedPayloadRequest = ::fidl::Request<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload>;
  using FlexibleOneWayNamedPayloadCompleter = ::fidl::internal::NaturalCompleter<::test_protocollayouts::OpenProtocol::FlexibleOneWayNamedPayload>;

  virtual void FlexibleOneWayNamedPayload(FlexibleOneWayNamedPayloadRequest& request,
                                          FlexibleOneWayNamedPayloadCompleter::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_protocollayouts::OpenProtocol> 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_protocollayouts::OpenProtocol> final {
  NaturalServerDispatcher() = delete;
  static void Dispatch(::fidl::Server<::test_protocollayouts::OpenProtocol>* 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 const ::fidl::internal::UnknownMethodHandlerEntry unknown_method_handler_entry_;
};

#endif  // __Fuchsia__

#pragma clang diagnostic pop
