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

#pragma once

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

namespace test_protocols {

class WithAndWithoutRequestResponse final {
  WithAndWithoutRequestResponse() = delete;

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

   public:
    using Protocol = ::test_protocols::WithAndWithoutRequestResponse;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = false;
  };
  class NoRequestEmptyResponse final {
    NoRequestEmptyResponse() = delete;

   public:
    using Protocol = ::test_protocols::WithAndWithoutRequestResponse;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = true;
  };
  class NoRequestWithResponse final {
    NoRequestWithResponse() = delete;

   public:
    using Protocol = ::test_protocols::WithAndWithoutRequestResponse;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = true;
  };
  class WithRequestNoResponse final {
    WithRequestNoResponse() = delete;

   public:
    using Protocol = ::test_protocols::WithAndWithoutRequestResponse;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = false;
  };
  class WithRequestEmptyResponse final {
    WithRequestEmptyResponse() = delete;

   public:
    using Protocol = ::test_protocols::WithAndWithoutRequestResponse;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = true;
  };
  class WithRequestWithResponse final {
    WithRequestWithResponse() = delete;

   public:
    using Protocol = ::test_protocols::WithAndWithoutRequestResponse;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = true;
  };
  class OnEmptyResponse final {
    OnEmptyResponse() = delete;

   public:
    using Protocol = ::test_protocols::WithAndWithoutRequestResponse;
    static constexpr bool kHasRequest = false;
    static constexpr bool kHasResponse = true;
  };
  class OnWithResponse final {
    OnWithResponse() = delete;

   public:
    using Protocol = ::test_protocols::WithAndWithoutRequestResponse;
    static constexpr bool kHasRequest = false;
    static constexpr bool kHasResponse = true;
  };
};

class Transitional final {
  Transitional() = delete;

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

   public:
    using Protocol = ::test_protocols::Transitional;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = true;
  };
  class OneWay final {
    OneWay() = delete;

   public:
    using Protocol = ::test_protocols::Transitional;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = false;
  };
  class Event final {
    Event() = delete;

   public:
    using Protocol = ::test_protocols::Transitional;
    static constexpr bool kHasRequest = false;
    static constexpr bool kHasResponse = true;
  };
};

class MethodWithUnion final {
  MethodWithUnion() = delete;

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

   public:
    using Protocol = ::test_protocols::MethodWithUnion;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = false;
  };
};

class WithProtocolEnds final {
  WithProtocolEnds() = delete;

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

   public:
    using Protocol = ::test_protocols::WithProtocolEnds;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = true;
  };
  class ServerEnds final {
    ServerEnds() = delete;

   public:
    using Protocol = ::test_protocols::WithProtocolEnds;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = true;
  };
  class StructContainingEnds final {
    StructContainingEnds() = delete;

   public:
    using Protocol = ::test_protocols::WithProtocolEnds;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = true;
  };
};

class ManyParameters final {
  ManyParameters() = delete;

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

   public:
    using Protocol = ::test_protocols::ManyParameters;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = false;
  };
};

class HandleRightsProtocol final {
  HandleRightsProtocol() = delete;

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

   public:
    using Protocol = ::test_protocols::HandleRightsProtocol;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = false;
  };
  class ResponseMethod final {
    ResponseMethod() = delete;

   public:
    using Protocol = ::test_protocols::HandleRightsProtocol;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = true;
  };
  class AnEvent final {
    AnEvent() = delete;

   public:
    using Protocol = ::test_protocols::HandleRightsProtocol;
    static constexpr bool kHasRequest = false;
    static constexpr bool kHasResponse = true;
  };
};

class WithErrorSyntax final {
  WithErrorSyntax() = delete;

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

   public:
    using Protocol = ::test_protocols::WithErrorSyntax;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = true;
  };
  class ErrorAsPrimitive final {
    ErrorAsPrimitive() = delete;

   public:
    using Protocol = ::test_protocols::WithErrorSyntax;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = true;
  };
  class ErrorAsEnum final {
    ErrorAsEnum() = delete;

   public:
    using Protocol = ::test_protocols::WithErrorSyntax;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = true;
  };
  class HandleInResult final {
    HandleInResult() = delete;

   public:
    using Protocol = ::test_protocols::WithErrorSyntax;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = true;
  };
};

class DiscoverableProtocol final {
  DiscoverableProtocol() = delete;

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

   public:
    using Protocol = ::test_protocols::DiscoverableProtocol;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = false;
  };
};

class ChannelProtocol final {
  ChannelProtocol() = delete;

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

   public:
    using Protocol = ::test_protocols::ChannelProtocol;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = false;
  };
  class EventA final {
    EventA() = delete;

   public:
    using Protocol = ::test_protocols::ChannelProtocol;
    static constexpr bool kHasRequest = false;
    static constexpr bool kHasResponse = true;
  };
  class MethodB final {
    MethodB() = delete;

   public:
    using Protocol = ::test_protocols::ChannelProtocol;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = true;
  };
  class TakeHandle final {
    TakeHandle() = delete;

   public:
    using Protocol = ::test_protocols::ChannelProtocol;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = true;
  };
  class MutateSocket final {
    MutateSocket() = delete;

   public:
    using Protocol = ::test_protocols::ChannelProtocol;
    static constexpr bool kHasRequest = true;
    static constexpr bool kHasResponse = true;
  };
};
}  // namespace test_protocols
