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

// fidl_experiment = output_index_json

#pragma once

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

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

namespace fidl {
namespace testing {

template <>
class WireTestBase<::test_bindingsdenylist::OnlyLibfuzzerAndDeps> : public ::fidl::WireServer<::test_bindingsdenylist::OnlyLibfuzzerAndDeps> {
 public:
  virtual ~WireTestBase<::test_bindingsdenylist::OnlyLibfuzzerAndDeps>() = default;
  virtual void NotImplemented_(const std::string& name, ::fidl::CompleterBase& completer) = 0;
};

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

template <>
class WireTestBase<::test_bindingsdenylist::OnlyCppAndDeps> : public ::fidl::WireServer<::test_bindingsdenylist::OnlyCppAndDeps> {
 public:
  virtual ~WireTestBase<::test_bindingsdenylist::OnlyCppAndDeps>() = default;
  virtual void NotImplemented_(const std::string& name, ::fidl::CompleterBase& completer) = 0;
};

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

template <>
class WireTestBase<::test_bindingsdenylist::DenyEachBinding> : public ::fidl::WireServer<::test_bindingsdenylist::DenyEachBinding> {
 public:
  virtual ~WireTestBase<::test_bindingsdenylist::DenyEachBinding>() = default;
  virtual void NotImplemented_(const std::string& name, ::fidl::CompleterBase& completer) = 0;
  virtual void OnlyDenyDart(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartRequest* request,
      OnlyDenyDartCompleter::Sync& completer) override {
    NotImplemented_("OnlyDenyDart", completer);
  }
  virtual void OnlyDenyGo(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoRequest* request,
      OnlyDenyGoCompleter::Sync& completer) override {
    NotImplemented_("OnlyDenyGo", completer);
  }
  virtual void OnlyDenyLibfuzzer(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerRequest* request,
      OnlyDenyLibfuzzerCompleter::Sync& completer) override {
    NotImplemented_("OnlyDenyLibfuzzer", completer);
  }
  virtual void OnlyDenyRust(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustRequest* request,
      OnlyDenyRustCompleter::Sync& completer) override {
    NotImplemented_("OnlyDenyRust", completer);
  }
  virtual void OnlyDenySyzkaller(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerRequest* request,
      OnlyDenySyzkallerCompleter::Sync& completer) override {
    NotImplemented_("OnlyDenySyzkaller", completer);
  }
};

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

template <>
class WireTestBase<::test_bindingsdenylist::Allowed> : public ::fidl::WireServer<::test_bindingsdenylist::Allowed> {
 public:
  virtual ~WireTestBase<::test_bindingsdenylist::Allowed>() = default;
  virtual void NotImplemented_(const std::string& name, ::fidl::CompleterBase& completer) = 0;
};

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

template <>
class WireTestBase<::test_bindingsdenylist::ImportsSameNameContext> : public ::fidl::WireServer<::test_bindingsdenylist::ImportsSameNameContext> {
 public:
  virtual ~WireTestBase<::test_bindingsdenylist::ImportsSameNameContext>() = default;
  virtual void NotImplemented_(const std::string& name, ::fidl::CompleterBase& completer) = 0;
  virtual void Unattributed(
      UnattributedCompleter::Sync& completer) override {
    NotImplemented_("Unattributed", completer);
  }
  virtual void AlwaysAppearsInImportingLibrary(
      AlwaysAppearsInImportingLibraryCompleter::Sync& completer) override {
    NotImplemented_("AlwaysAppearsInImportingLibrary", completer);
  }
};

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

}  // namespace testing
}  // namespace fidl
