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

#pragma once

#include <lib/fidl/llcpp/internal/transport.h>

namespace test_protocolpayloads {

class MainProtocol final {
  MainProtocol() = delete;

 public:
  using Transport = ::fidl::internal::ChannelTransport;
  class OneWayComposed final {
    OneWayComposed() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = false;
  };
  class TwoWayComposed final {
    TwoWayComposed() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = true;
  };
  class TwoWayComposedWithError final {
    TwoWayComposedWithError() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = true;
  };
  class OnComposed final {
    OnComposed() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasRequest = false;
    static constexpr bool kHasResponse = true;
  };
  class OnComposedWithError final {
    OnComposedWithError() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasRequest = false;
    static constexpr bool kHasResponse = true;
  };
  class OneWayLocal final {
    OneWayLocal() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = false;
  };
  class TwoWayLocal final {
    TwoWayLocal() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = true;
  };
  class TwoWayLocalWithError final {
    TwoWayLocalWithError() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = true;
  };
  class OnLocal final {
    OnLocal() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasRequest = false;
    static constexpr bool kHasResponse = true;
  };
  class OnLocalWithError final {
    OnLocalWithError() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasRequest = false;
    static constexpr bool kHasResponse = true;
  };
  class OneWayImport final {
    OneWayImport() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = false;
  };
  class TwoWayImport final {
    TwoWayImport() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = true;
  };
  class TwoWayImportWithError final {
    TwoWayImportWithError() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = true;
  };
  class OnImport final {
    OnImport() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasRequest = false;
    static constexpr bool kHasResponse = true;
  };
  class OnImportWithError final {
    OnImportWithError() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasRequest = false;
    static constexpr bool kHasResponse = true;
  };
  class OneWayAnon final {
    OneWayAnon() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = false;
  };
  class TwoWayAnon final {
    TwoWayAnon() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = true;
  };
  class TwoWayAnonWithError final {
    TwoWayAnonWithError() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = true;
  };
  class OnAnon final {
    OnAnon() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasRequest = false;
    static constexpr bool kHasResponse = true;
  };
  class OnAnonWithError final {
    OnAnonWithError() = delete;

   public:
    using Protocol = ::test_protocolpayloads::MainProtocol;
    static constexpr bool kHasRequest = false;
    static constexpr bool kHasResponse = true;
  };
};
}  // namespace test_protocolpayloads
