blob: 9f4b1932235a29598087d5631505c57cab1b8b57 [file] [log] [blame]
// Copyright 2019 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.
use {
crate::{
fuchsia_boot_resolver::{self, FuchsiaBootResolver},
fuchsia_pkg_resolver::{self, FuchsiaPkgResolver},
model::ResolverRegistry,
},
failure::{Error, ResultExt},
fidl::endpoints::ServiceMarker,
fidl_fuchsia_pkg::{PackageResolverMarker, PackageResolverProxy},
fuchsia_component::client::connect_to_service,
std::path::PathBuf,
};
pub fn available_resolvers() -> Result<ResolverRegistry, Error> {
let mut resolver_registry = ResolverRegistry::new();
resolver_registry
.register(fuchsia_boot_resolver::SCHEME.to_string(), Box::new(FuchsiaBootResolver::new()));
// Add the fuchsia-pkg resolver to the registry if it's available.
if let Some(pkg_resolver) = connect_pkg_resolver()? {
resolver_registry.register(
fuchsia_pkg_resolver::SCHEME.to_string(),
Box::new(FuchsiaPkgResolver::new(pkg_resolver)),
);
}
Ok(resolver_registry)
}
/// Checks if a package resolver service is available through our namespace and connects to it if
/// so. If not availble, returns Ok(None).
fn connect_pkg_resolver() -> Result<Option<PackageResolverProxy>, Error> {
let service_path = PathBuf::from(format!("/svc/{}", PackageResolverMarker::NAME));
if !service_path.exists() {
return Ok(None);
}
let pkg_resolver = connect_to_service::<PackageResolverMarker>()
.context("error connecting to package resolver")?;
return Ok(Some(pkg_resolver));
}