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

// fidl_experiment = output_index_json

#pragma once

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

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

namespace fidl {
namespace testing {

template <>
class TestBase<::test_protocolpayloads::MainProtocol> : public ::fidl::Server<::test_protocolpayloads::MainProtocol> {
 public:
  virtual ~TestBase<::test_protocolpayloads::MainProtocol>() = default;
  virtual void NotImplemented_(const std::string& name, ::fidl::CompleterBase& completer) = 0;
  virtual void OneWayComposed(OneWayComposedRequest& request,
                              OneWayComposedCompleter::Sync& completer) {
    NotImplemented_("OneWayComposed", completer);
  }
  virtual void TwoWayComposed(TwoWayComposedRequest& request,
                              TwoWayComposedCompleter::Sync& completer) {
    NotImplemented_("TwoWayComposed", completer);
  }
  virtual void TwoWayComposedWithError(TwoWayComposedWithErrorRequest& request,
                                       TwoWayComposedWithErrorCompleter::Sync& completer) {
    NotImplemented_("TwoWayComposedWithError", completer);
  }
  virtual void OneWayLocal(OneWayLocalRequest& request,
                           OneWayLocalCompleter::Sync& completer) {
    NotImplemented_("OneWayLocal", completer);
  }
  virtual void TwoWayLocal(TwoWayLocalRequest& request,
                           TwoWayLocalCompleter::Sync& completer) {
    NotImplemented_("TwoWayLocal", completer);
  }
  virtual void TwoWayLocalWithError(TwoWayLocalWithErrorRequest& request,
                                    TwoWayLocalWithErrorCompleter::Sync& completer) {
    NotImplemented_("TwoWayLocalWithError", completer);
  }
  virtual void OneWayImport(OneWayImportRequest& request,
                            OneWayImportCompleter::Sync& completer) {
    NotImplemented_("OneWayImport", completer);
  }
  virtual void TwoWayImport(TwoWayImportRequest& request,
                            TwoWayImportCompleter::Sync& completer) {
    NotImplemented_("TwoWayImport", completer);
  }
  virtual void TwoWayImportWithError(TwoWayImportWithErrorRequest& request,
                                     TwoWayImportWithErrorCompleter::Sync& completer) {
    NotImplemented_("TwoWayImportWithError", completer);
  }
  virtual void OneWayAnon(OneWayAnonRequest& request,
                          OneWayAnonCompleter::Sync& completer) {
    NotImplemented_("OneWayAnon", completer);
  }
  virtual void TwoWayAnon(TwoWayAnonRequest& request,
                          TwoWayAnonCompleter::Sync& completer) {
    NotImplemented_("TwoWayAnon", completer);
  }
  virtual void TwoWayAnonWithError(TwoWayAnonWithErrorRequest& request,
                                   TwoWayAnonWithErrorCompleter::Sync& completer) {
    NotImplemented_("TwoWayAnonWithError", completer);
  }
};
#pragma clang diagnostic pop

}  // namespace testing
}  // namespace fidl
