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

// fidl_experiment = output_index_json

#pragma once

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

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

namespace fidl {
namespace testing {

template <>
class WireTestBase<::test_protocolpayloads::MainProtocol> : public ::fidl::WireServer<::test_protocolpayloads::MainProtocol> {
 public:
  virtual ~WireTestBase<::test_protocolpayloads::MainProtocol>() = default;
  virtual void NotImplemented_(const std::string& name, ::fidl::CompleterBase& completer) = 0;
  virtual void OneWayComposed(
      ::test_protocolpayloads_imported::wire::ImportStructPayload* request,
      OneWayComposedCompleter::Sync& completer) override {
    NotImplemented_("OneWayComposed", completer);
  }
  virtual void TwoWayComposed(
      ::test_protocolpayloads_imported::wire::ImportStructPayload* request,
      TwoWayComposedCompleter::Sync& completer) override {
    NotImplemented_("TwoWayComposed", completer);
  }
  virtual void TwoWayComposedWithError(
      ::test_protocolpayloads_imported::wire::ImportStructPayload* request,
      TwoWayComposedWithErrorCompleter::Sync& completer) override {
    NotImplemented_("TwoWayComposedWithError", completer);
  }
  virtual void OneWayLocal(
      ::test_protocolpayloads::wire::LocalStructPayload* request,
      OneWayLocalCompleter::Sync& completer) override {
    NotImplemented_("OneWayLocal", completer);
  }
  virtual void TwoWayLocal(
      ::test_protocolpayloads::wire::LocalStructPayload* request,
      TwoWayLocalCompleter::Sync& completer) override {
    NotImplemented_("TwoWayLocal", completer);
  }
  virtual void TwoWayLocalWithError(
      ::test_protocolpayloads::wire::LocalStructPayload* request,
      TwoWayLocalWithErrorCompleter::Sync& completer) override {
    NotImplemented_("TwoWayLocalWithError", completer);
  }
  virtual void OneWayImport(
      ::test_protocolpayloads_imported::wire::ImportStructPayload* request,
      OneWayImportCompleter::Sync& completer) override {
    NotImplemented_("OneWayImport", completer);
  }
  virtual void TwoWayImport(
      ::test_protocolpayloads_imported::wire::ImportStructPayload* request,
      TwoWayImportCompleter::Sync& completer) override {
    NotImplemented_("TwoWayImport", completer);
  }
  virtual void TwoWayImportWithError(
      ::test_protocolpayloads_imported::wire::ImportStructPayload* request,
      TwoWayImportWithErrorCompleter::Sync& completer) override {
    NotImplemented_("TwoWayImportWithError", completer);
  }
  virtual void OneWayAnon(
      ::test_protocolpayloads::wire::MainProtocolOneWayAnonRequest* request,
      OneWayAnonCompleter::Sync& completer) override {
    NotImplemented_("OneWayAnon", completer);
  }
  virtual void TwoWayAnon(
      ::test_protocolpayloads::wire::MainProtocolTwoWayAnonRequest* request,
      TwoWayAnonCompleter::Sync& completer) override {
    NotImplemented_("TwoWayAnon", completer);
  }
  virtual void TwoWayAnonWithError(
      ::test_protocolpayloads::wire::MainProtocolTwoWayAnonWithErrorRequest* request,
      TwoWayAnonWithErrorCompleter::Sync& completer) override {
    NotImplemented_("TwoWayAnonWithError", completer);
  }
};

template <>
class WireSyncEventHandlerTestBase<::test_protocolpayloads::MainProtocol> : public ::fidl::WireSyncEventHandler<::test_protocolpayloads::MainProtocol> {
 public:
  virtual ~WireSyncEventHandlerTestBase<::test_protocolpayloads::MainProtocol>() = default;
  virtual void NotImplemented_(const std::string& name) = 0;
  void OnComposed(::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnComposed>* event) override {
    NotImplemented_("OnComposed");
  }
  void OnLocal(::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnLocal>* event) override {
    NotImplemented_("OnLocal");
  }
  void OnImport(::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnImport>* event) override {
    NotImplemented_("OnImport");
  }
  void OnAnon(::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnAnon>* event) override {
    NotImplemented_("OnAnon");
  }
};
#pragma clang diagnostic pop

}  // namespace testing
}  // namespace fidl
