// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "child-driver.h"

#include <fidl/examples.gizmo/cpp/wire.h>
#include <lib/driver/component/cpp/service_client.h>
#include <lib/driver/component/cpp/driver_export.h>

namespace child_driver {

zx::result<> ChildDriver::Start() {
  auto connect_result = incoming()->Connect<examples_gizmo::Service::Testing>();
  if (connect_result.is_error()) {
    FDF_SLOG(WARNING, "Failed to connect to gizmo service.",
             KV("status", connect_result.status_string()));
    return connect_result.take_error();
  }

  auto client = fidl::WireSyncClient(std::move(connect_result.value()));
  auto get_result = client->Get();
  if (!get_result.ok()) {
    FDF_SLOG(WARNING, "Failed to send Get to TestingProtocol.",
             KV("status", get_result.error().status_string()));
    return zx::error(get_result.error().status());
  }

  FDF_LOG(INFO, "Succeeded!");
  return zx::ok();
}

}  // namespace child_driver

FUCHSIA_DRIVER_RECORD_CPP_V2(fdf::Record<child_driver::ChildDriver>);
