// Copyright 2021 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 <lib/driver/promise/cpp/promise.h>
#include <lib/fpromise/bridge.h>
#include <zircon/availability.h>

namespace fdf {

namespace internal {

fpromise::result<fidl::WireSharedClient<fuchsia_io::File>, zx_status_t> OpenWithResult(
    const fdf::Namespace& ns, async_dispatcher_t* dispatcher, const char* path,
    fuchsia_io::Flags flags) {
  auto file = ns.Open<fuchsia_io::File>(path, flags);
  if (file.is_error()) {
    return fpromise::error(file.status_value());
  }
  fidl::WireSharedClient client(std::move(*file), dispatcher);
  return fpromise::ok(std::move(client));
}

}  // namespace internal

fpromise::promise<void, fuchsia_driver_framework::wire::NodeError> AddChild(
    fidl::WireSharedClient<fuchsia_driver_framework::Node>& client,
    fuchsia_driver_framework::wire::NodeAddArgs args,
    fidl::ServerEnd<fuchsia_driver_framework::NodeController> controller,
    fidl::ServerEnd<fuchsia_driver_framework::Node> node) {
  fpromise::bridge<void, fuchsia_driver_framework::wire::NodeError> bridge;
  auto callback =
      [completer = std::move(bridge.completer)](
          fidl::WireUnownedResult<fuchsia_driver_framework::Node::AddChild>& result) mutable {
        if (!result.ok()) {
          completer.complete_error(fuchsia_driver_framework::wire::NodeError::kInternal);
          return;
        }
        if (result->is_error()) {
          completer.complete_error(result->error_value());
          return;
        }
        completer.complete_ok();
      };
  client->AddChild(args, std::move(controller), std::move(node))
      .ThenExactlyOnce(std::move(callback));
  return bridge.consumer.promise();
}

}  // namespace fdf
