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

// fidl_experiment = output_index_json

#pragma once

#include <fidl/test.service/cpp/wire.h>

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow"

namespace fidl {
namespace testing {

template <>
class WireTestBase<::test_service::FirstProtocol> : public ::fidl::WireServer<::test_service::FirstProtocol> {
 public:
  virtual ~WireTestBase<::test_service::FirstProtocol>() = default;
  virtual void NotImplemented_(const std::string& name, ::fidl::CompleterBase& completer) = 0;
  virtual void MethodOnFirst(
      MethodOnFirstCompleter::Sync& completer) override {
    NotImplemented_("MethodOnFirst", completer);
  }
};

template <>
class WireSyncEventHandlerTestBase<::test_service::FirstProtocol> : public ::fidl::WireSyncEventHandler<::test_service::FirstProtocol> {
 public:
  virtual ~WireSyncEventHandlerTestBase<::test_service::FirstProtocol>() = default;
  virtual void NotImplemented_(const std::string& name) = 0;
};

template <>
class WireTestBase<::test_service::SecondProtocol> : public ::fidl::WireServer<::test_service::SecondProtocol> {
 public:
  virtual ~WireTestBase<::test_service::SecondProtocol>() = default;
  virtual void NotImplemented_(const std::string& name, ::fidl::CompleterBase& completer) = 0;
  virtual void MethodOnSecond(
      MethodOnSecondCompleter::Sync& completer) override {
    NotImplemented_("MethodOnSecond", completer);
  }
};

template <>
class WireSyncEventHandlerTestBase<::test_service::SecondProtocol> : public ::fidl::WireSyncEventHandler<::test_service::SecondProtocol> {
 public:
  virtual ~WireSyncEventHandlerTestBase<::test_service::SecondProtocol>() = default;
  virtual void NotImplemented_(const std::string& name) = 0;
};
#pragma clang diagnostic pop

}  // namespace testing
}  // namespace fidl
