blob: 94778d42f7e3cfc18f37ddf66d568f39a02c15a6 [file] [edit]
// Copyright 2026 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 <fidl/fuchsia.driver.framework/cpp/natural_messaging.h>
#include <lib/driver/node/cpp/provide-resource.h>
namespace fdf {
#if FUCHSIA_API_LEVEL_AT_LEAST(HEAD)
zx::result<fidl::ClientEnd<fuchsia_driver_framework::ResourceController>> ProvideResource(
fidl::UnownedClientEnd<fuchsia_driver_framework::Node> parent, fdf::Logger& logger,
std::string_view node_name,
cpp20::span<const fuchsia_driver_framework::NodeProperty2> properties,
cpp20::span<const fuchsia_driver_framework::Offer> offers) {
auto [resource_controller_client_end, resource_controller_server_end] =
fidl::Endpoints<fuchsia_driver_framework::ResourceController>::Create();
std::vector<fuchsia_driver_framework::NodeProperty2> props{properties.begin(), properties.end()};
std::vector<fuchsia_driver_framework::Offer> offers_vec(offers.begin(), offers.end());
fuchsia_driver_framework::ResourceArgs args{{
.name = std::string(node_name),
.properties = std::move(props),
.offers = std::move(offers_vec),
}};
fidl::Result<fuchsia_driver_framework::Node::ProvideResource> result =
fidl::Call(parent)->ProvideResource(
{std::move(args), std::move(resource_controller_server_end)});
if (result.is_error()) {
logger.log(fdf::LogSeverity::ERROR, "Failed to provide resource {}. Error: {}", node_name,
result.error_value().FormatDescription());
return zx::error(result.error_value().is_framework_error()
? result.error_value().framework_error().status()
: ZX_ERR_INTERNAL);
}
return zx::ok(std::move(resource_controller_client_end));
}
#endif
} // namespace fdf