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

// fidl_experiment = output_index_json

#pragma once

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

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

namespace fidl {
namespace testing {

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

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

template <>
class TestBase<::test_bindingsdenylist::DenyEachBinding> : public ::fidl::Server<::test_bindingsdenylist::DenyEachBinding> {
 public:
  virtual ~TestBase<::test_bindingsdenylist::DenyEachBinding>() = default;
  virtual void NotImplemented_(const std::string& name, ::fidl::CompleterBase& completer) = 0;
  virtual void OnlyDenyDart(OnlyDenyDartRequest& request,
                            OnlyDenyDartCompleter::Sync& completer) {
    NotImplemented_("OnlyDenyDart", completer);
  }
  virtual void OnlyDenyGo(OnlyDenyGoRequest& request,
                          OnlyDenyGoCompleter::Sync& completer) {
    NotImplemented_("OnlyDenyGo", completer);
  }
  virtual void OnlyDenyLibfuzzer(OnlyDenyLibfuzzerRequest& request,
                                 OnlyDenyLibfuzzerCompleter::Sync& completer) {
    NotImplemented_("OnlyDenyLibfuzzer", completer);
  }
  virtual void OnlyDenyRust(OnlyDenyRustRequest& request,
                            OnlyDenyRustCompleter::Sync& completer) {
    NotImplemented_("OnlyDenyRust", completer);
  }
  virtual void OnlyDenySyzkaller(OnlyDenySyzkallerRequest& request,
                                 OnlyDenySyzkallerCompleter::Sync& completer) {
    NotImplemented_("OnlyDenySyzkaller", completer);
  }
};

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

template <>
class TestBase<::test_bindingsdenylist::ImportsSameNameContext> : public ::fidl::Server<::test_bindingsdenylist::ImportsSameNameContext> {
 public:
  virtual ~TestBase<::test_bindingsdenylist::ImportsSameNameContext>() = default;
  virtual void NotImplemented_(const std::string& name, ::fidl::CompleterBase& completer) = 0;
  virtual void Unattributed(
      UnattributedCompleter::Sync& completer) {
    NotImplemented_("Unattributed", completer);
  }
  virtual void AlwaysAppearsInImportingLibrary(
      AlwaysAppearsInImportingLibraryCompleter::Sync& completer) {
    NotImplemented_("AlwaysAppearsInImportingLibrary", completer);
  }
};
#pragma clang diagnostic pop

}  // namespace testing
}  // namespace fidl
