blob: 872ccedc3d47b9e5f6b8194a4edb95ea8a5120fe [file] [log] [blame]
// Copyright 2020 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 {fidl_fuchsia_component_decl as fdecl, fidl_fuchsia_component_resolution as fresolution};
mod base_resolver;
mod pkg_cache_resolver;
#[fuchsia::main]
async fn main() -> anyhow::Result<()> {
let args = std::env::args().collect::<Vec<_>>();
let args = args.iter().map(|s| s.as_str()).collect::<Vec<_>>();
match args.as_slice() {
["/pkg/bin/base_resolver", "base_resolver"] => base_resolver::main().await,
["/pkg/bin/base_resolver", "pkg_cache_resolver"] => pkg_cache_resolver::main().await,
_ => {
log::error!("invalid args {:?}", args);
anyhow::bail!("invalid args {:?}", args)
}
}
}
#[derive(thiserror::Error, Debug)]
enum ResolverError {
#[error("invalid component URL")]
InvalidUrl(#[from] fuchsia_url::errors::ParseError),
#[error("component URL with package hash not supported")]
PackageHashNotSupported,
#[error("the hostname refers to an unsupported repo")]
UnsupportedRepo,
#[error("component not found")]
ComponentNotFound(#[source] mem_util::FileError),
#[error("package not found")]
PackageNotFound(#[source] fuchsia_fs::node::OpenError),
#[error("couldn't parse component manifest")]
ParsingManifest(#[source] fidl::Error),
#[error("couldn't find config values")]
ConfigValuesNotFound(#[source] mem_util::FileError),
#[error("config source missing or invalid")]
InvalidConfigSource,
#[error("unsupported config source: {:?}", _0)]
UnsupportedConfigSource(fdecl::ConfigValueSource),
#[error("failed to read the manifest")]
ReadManifest(#[source] mem_util::DataError),
#[error("failed to create FIDL endpoints")]
CreateEndpoints(#[source] fidl::Error),
#[error("serve package directory")]
ServePackageDirectory(#[source] package_directory::Error),
#[error("failed to read the resolution context")]
ReadingContext(#[source] anyhow::Error),
#[error("failed to create the resolution context")]
CreatingContext(#[source] anyhow::Error),
#[error("subpackage name was not found in the package's subpackage list")]
SubpackageNotFound(#[source] anyhow::Error),
#[error("the subpackage hash was not found in the system base package index: {0}")]
SubpackageNotInBase(#[source] anyhow::Error),
#[error("missing context required to resolve relative url: {0}")]
RelativeUrlMissingContext(String),
#[error("internal error")]
Internal,
}
impl From<&ResolverError> for fresolution::ResolverError {
fn from(err: &ResolverError) -> fresolution::ResolverError {
use ResolverError::*;
match err {
InvalidUrl(_) | PackageHashNotSupported => fresolution::ResolverError::InvalidArgs,
UnsupportedRepo => fresolution::ResolverError::NotSupported,
ComponentNotFound(_) => fresolution::ResolverError::ManifestNotFound,
PackageNotFound(_) => fresolution::ResolverError::PackageNotFound,
ConfigValuesNotFound(_) => fresolution::ResolverError::ConfigValuesNotFound,
ParsingManifest(_) | UnsupportedConfigSource(_) | InvalidConfigSource => {
fresolution::ResolverError::InvalidManifest
}
ReadManifest(_) | CreateEndpoints(_) | ServePackageDirectory(_) => {
fresolution::ResolverError::Io
}
CreatingContext(_) => fresolution::ResolverError::Internal,
ReadingContext(_) => fresolution::ResolverError::Internal,
SubpackageNotInBase(_) | SubpackageNotFound(_) => {
fresolution::ResolverError::PackageNotFound
}
RelativeUrlMissingContext(_) => fresolution::ResolverError::InvalidArgs,
Internal => fresolution::ResolverError::Internal,
}
}
}