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

// fidl_experiment = output_index_json

#pragma once

#include "lib/fidl/cpp/internal/header.h"

namespace test {
namespace driverservice {

//
// Domain objects declarations
//

#ifdef __Fuchsia__
class DriverOnlyService;

#endif  // __Fuchsia__

}  // namespace driverservice
}  // namespace test
namespace fidl {

//
// Proxies and stubs declarations
//
}  // namespace fidl
namespace test {
namespace driverservice {

#ifdef __Fuchsia__
class DriverOnlyService;

#endif  // __Fuchsia__

#ifdef __Fuchsia__

class DriverOnlyService final {
 public:
  class Handler;

  static constexpr char Name[] = "test.driverservice.DriverOnlyService";

  explicit DriverOnlyService(std::unique_ptr<::fidl::ServiceConnector> service)
      : service_(std::move(service)) {}

  explicit operator bool() const { return !!service_; }
  /// Returns a |fidl::MemberConnector| which can be used to connect to the member protocol "member".
  ::fidl::MemberConnector<::test::driverservice::SomeDriverProtocol> member() const {
    return ::fidl::MemberConnector<::test::driverservice::SomeDriverProtocol>(service_.get(), "member");
  }

 private:
  std::unique_ptr<::fidl::ServiceConnector> service_;
};

/// Facilitates member protocol registration for servers.
class DriverOnlyService::Handler final {
 public:
  /// Constructs a new |Handler|. Does not take ownership of |service|.
  explicit Handler(::fidl::ServiceHandlerBase* service)
      : service_(service) {}
  /// Adds member "member" to the service instance. |handler| is invoked when a connection
  /// is made to the member protocol.
  ///
  /// # Errors
  ///
  /// Returns ZX_ERR_ALREADY_EXISTS if the member was already added.
  zx_status_t add_member(::fidl::InterfaceRequestHandler<::test::driverservice::SomeDriverProtocol> handler) {
    return service_->AddMember("member", std::move(handler));
  }

 private:
  ::fidl::ServiceHandlerBase* const service_;
};

#endif  // __Fuchsia__

}  // namespace driverservice
}  // namespace test
