// 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_protocollayoutssamelibrary {

class ComposedProtocol final {
  ComposedProtocol() = delete;

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

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

  class OneWayAnonComposed final {
    OneWayAnonComposed() = delete;

   public:
    using Protocol = ::test_protocollayoutssamelibrary::ComposedProtocol;
    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 TwoWayAnonComposed final {
    TwoWayAnonComposed() = delete;

   public:
    using Protocol = ::test_protocollayoutssamelibrary::ComposedProtocol;
    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 TwoWayAnonComposedWithError final {
    TwoWayAnonComposedWithError() = delete;

   public:
    using Protocol = ::test_protocollayoutssamelibrary::ComposedProtocol;
    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 OnAnonComposed final {
    OnAnonComposed() = delete;

   public:
    using Protocol = ::test_protocollayoutssamelibrary::ComposedProtocol;
    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 OneWayNamedComposed final {
    OneWayNamedComposed() = delete;

   public:
    using Protocol = ::test_protocollayoutssamelibrary::ComposedProtocol;
    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 TwoWayNamedComposed final {
    TwoWayNamedComposed() = delete;

   public:
    using Protocol = ::test_protocollayoutssamelibrary::ComposedProtocol;
    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 TwoWayNamedComposedWithError final {
    TwoWayNamedComposedWithError() = delete;

   public:
    using Protocol = ::test_protocollayoutssamelibrary::ComposedProtocol;
    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 OnNamedComposed final {
    OnNamedComposed() = delete;

   public:
    using Protocol = ::test_protocollayoutssamelibrary::ComposedProtocol;
    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 MainProtocol final {
  MainProtocol() = delete;

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

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

  class OneWayAnonComposed final {
    OneWayAnonComposed() = delete;

   public:
    using Protocol = ::test_protocollayoutssamelibrary::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 TwoWayAnonComposed final {
    TwoWayAnonComposed() = delete;

   public:
    using Protocol = ::test_protocollayoutssamelibrary::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 TwoWayAnonComposedWithError final {
    TwoWayAnonComposedWithError() = delete;

   public:
    using Protocol = ::test_protocollayoutssamelibrary::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 OnAnonComposed final {
    OnAnonComposed() = delete;

   public:
    using Protocol = ::test_protocollayoutssamelibrary::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 OneWayNamedComposed final {
    OneWayNamedComposed() = delete;

   public:
    using Protocol = ::test_protocollayoutssamelibrary::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 TwoWayNamedComposed final {
    TwoWayNamedComposed() = delete;

   public:
    using Protocol = ::test_protocollayoutssamelibrary::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 TwoWayNamedComposedWithError final {
    TwoWayNamedComposedWithError() = delete;

   public:
    using Protocol = ::test_protocollayoutssamelibrary::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 OnNamedComposed final {
    OnNamedComposed() = delete;

   public:
    using Protocol = ::test_protocollayoutssamelibrary::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_protocollayoutssamelibrary::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_protocollayoutssamelibrary::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_protocollayoutssamelibrary::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_protocollayoutssamelibrary::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_protocollayoutssamelibrary::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_protocollayoutssamelibrary::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_protocollayoutssamelibrary::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_protocollayoutssamelibrary::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_protocollayoutssamelibrary
namespace fidl {

template <>
struct IsProtocol<::test_protocollayoutssamelibrary::ComposedProtocol> : public std::true_type {};

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

}  // namespace fidl
