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

// fidl_experiment = output_index_json

#pragma once

#include <fidl/test.service/cpp/markers.h>
#include <fidl/test.service/cpp/wire_types.h>
#include <lib/fidl_driver/cpp/wire_messaging.h>

#ifdef __Fuchsia__

#include <lib/fidl/cpp/wire/connect_service.h>
#include <lib/fidl/cpp/wire/server.h>
#include <lib/fidl/cpp/wire/service_handler.h>
#include <lib/fidl/cpp/wire/sync_call.h>
#include <lib/fidl_driver/cpp/server.h>
#include <lib/fidl_driver/cpp/wire_client.h>

#endif  // __Fuchsia__

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

namespace test_service {

class EmptyService;

class EmptyService final {
  EmptyService() = default;

 public:
  static constexpr bool kIsService = true;
  static constexpr char Name[] = "test.service.EmptyService";
  using Transport = ::fidl::internal::ChannelTransport;
#ifdef __Fuchsia__
  using ServiceInstanceHandler = fidl::ServiceInstanceHandler<::fidl::internal::ChannelTransport>;

#endif  // __Fuchsia__

  // Client protocol for connecting to member protocols of a service instance.
  class ServiceClient final {
    ServiceClient() = delete;
#ifdef __Fuchsia__
   public:
    ServiceClient(::zx::channel dir, ::fidl::internal::ConnectMemberFunc connect_func) {
      (void)dir;
      (void)connect_func;
    }

   private:
#endif  // __Fuchsia__
  };
#ifdef __Fuchsia__
  // Facilitates member protocol registration for servers.
  class InstanceHandler final : public fidl::ServiceInstanceHandler<::fidl::internal::ChannelTransport> {
   public:
    struct Members {
    };

    InstanceHandler() = default;

    // Construct an instance handler for a FIDL service. It is expected that every member
    // contained in |members| is initialized with a handler.
    InstanceHandler(Members members) {
      // This should always be ZX_OK. That's because the only possible
      // error is ZX_ERR_ALREADY_EXISTS which is impossible to occur as fidlc
      // won't allow service declarations with duplicated names.
    }
  };

#endif  // __Fuchsia__
};

}  // namespace test_service
namespace fidl {

#pragma clang diagnostic pop

}  // namespace fidl
