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

// fidl_experiment = output_index_json

#pragma once

#include <lib/fidl/cpp/wire/internal/transport.h>
#include <lib/fidl/cpp/wire/unknown_interactions.h>

namespace test_protocolpayloads {

class MainProtocol final {
  MainProtocol() = delete;

 public:
  using Transport = ::fidl::internal::ChannelTransport;

  static constexpr ::fidl::internal::Openness kOpenness = ::fidl::internal::Openness::kClosed;

  class OneWayComposed final {
    OneWayComposed() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = true;
    static constexpr bool kHasServerToClient = false;
    static constexpr bool kHasServerToClientBody = false;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class TwoWayComposed final {
    TwoWayComposed() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = true;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class TwoWayComposedWithError final {
    TwoWayComposedWithError() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = true;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = false;
  };
  class OnComposed final {
    OnComposed() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasClientToServer = false;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class OneWayLocal final {
    OneWayLocal() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = true;
    static constexpr bool kHasServerToClient = false;
    static constexpr bool kHasServerToClientBody = false;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class TwoWayLocal final {
    TwoWayLocal() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = true;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class TwoWayLocalWithError final {
    TwoWayLocalWithError() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = true;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = false;
  };
  class OnLocal final {
    OnLocal() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasClientToServer = false;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class OneWayImport final {
    OneWayImport() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = true;
    static constexpr bool kHasServerToClient = false;
    static constexpr bool kHasServerToClientBody = false;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class TwoWayImport final {
    TwoWayImport() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = true;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class TwoWayImportWithError final {
    TwoWayImportWithError() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = true;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = false;
  };
  class OnImport final {
    OnImport() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasClientToServer = false;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class OneWayAnon final {
    OneWayAnon() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = true;
    static constexpr bool kHasServerToClient = false;
    static constexpr bool kHasServerToClientBody = false;

    static constexpr bool kHasNonEmptyUserFacingResponse = false;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class TwoWayAnon final {
    TwoWayAnon() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = true;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class TwoWayAnonWithError final {
    TwoWayAnonWithError() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = true;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = true;
    static constexpr bool kHasFrameworkError = false;
  };
  class OnAnon final {
    OnAnon() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasClientToServer = false;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
};

}  // namespace test_protocolpayloads
namespace fidl {

template <>
struct IsProtocol<::test_protocolpayloads::MainProtocol> : public std::true_type {};

}  // namespace fidl
