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

// fidl_experiment = output_index_json

#pragma once

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

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

namespace fidl {
namespace testing {

template <>
class WireTestBase<::test_requestflexibleenvelope::Protocol> : public ::fidl::WireServer<::test_requestflexibleenvelope::Protocol> {
 public:
  virtual ~WireTestBase<::test_requestflexibleenvelope::Protocol>() = default;
  virtual void NotImplemented_(const std::string& name, ::fidl::CompleterBase& completer) = 0;
  virtual void RequestStrictResponseFlexible(
      ::test_requestflexibleenvelope::wire::ProtocolRequestStrictResponseFlexibleRequest* request,
      RequestStrictResponseFlexibleCompleter::Sync& completer) override {
    NotImplemented_("RequestStrictResponseFlexible", completer);
  }
  virtual void RequestFlexibleResponseStrict(
      ::test_requestflexibleenvelope::wire::ProtocolRequestFlexibleResponseStrictRequest* request,
      RequestFlexibleResponseStrictCompleter::Sync& completer) override {
    NotImplemented_("RequestFlexibleResponseStrict", completer);
  }
};

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

}  // namespace testing
}  // namespace fidl
