diff --git a/crates/wac-resolver/src/lib.rs b/crates/wac-resolver/src/lib.rs index 6ec7a62..4963b48 100644 --- a/crates/wac-resolver/src/lib.rs +++ b/crates/wac-resolver/src/lib.rs @@ -19,6 +19,9 @@ use wac_types::BorrowedPackageKey; #[derive(thiserror::Error, Diagnostic, Debug)] #[diagnostic(code("failed to resolve document"))] pub enum Error { + /// Failed to create registry client. + #[error("failed to create registry client: {0:#}")] + RegistryClientFailed(anyhow::Error), /// An unknown package was encountered. #[error("unknown package `{name}`")] UnknownPackage { diff --git a/src/commands/encode.rs b/src/commands/encode.rs index 1bc8c29..1b5227f 100644 --- a/src/commands/encode.rs +++ b/src/commands/encode.rs @@ -79,7 +79,7 @@ impl EncodeCommand { let document = Document::parse(&contents).map_err(|e| fmt_err(e, &self.path, &contents))?; - let resolver = PackageResolver::new( + let mut resolver = PackageResolver::new( self.deps_dir, self.deps.into_iter().collect(), #[cfg(feature = "registry")] diff --git a/src/commands/resolve.rs b/src/commands/resolve.rs index ba29414..0d1f256 100644 --- a/src/commands/resolve.rs +++ b/src/commands/resolve.rs @@ -51,7 +51,7 @@ impl ResolveCommand { let document = Document::parse(&contents).map_err(|e| fmt_err(e, &self.path, &contents))?; - let resolver = PackageResolver::new( + let mut resolver = PackageResolver::new( self.deps_dir, self.deps.into_iter().collect(), #[cfg(feature = "registry")] diff --git a/src/lib.rs b/src/lib.rs index 03e460c..d2667e1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -47,7 +47,7 @@ fn fmt_err(e: impl Into, path: &Path, source: &str) -> anyhow::Error { pub struct PackageResolver { fs: FileSystemPackageResolver, #[cfg(feature = "registry")] - registry: wac_resolver::RegistryPackageResolver, + registry: Option, } impl PackageResolver { @@ -60,17 +60,23 @@ impl PackageResolver { Ok(Self { fs: FileSystemPackageResolver::new(dir, overrides, false), #[cfg(feature = "registry")] - registry: wac_resolver::RegistryPackageResolver::new( - registry, - Some(Box::new(progress::ProgressBar::new())), - ) - .await?, + registry: if registry.is_some() { + Some( + wac_resolver::RegistryPackageResolver::new( + registry, + Some(Box::new(progress::ProgressBar::new())), + ) + .await?, + ) + } else { + None + }, }) } /// Resolve all packages referenced in the given document. pub async fn resolve<'a>( - &self, + &mut self, document: &'a Document<'a>, ) -> Result, Vec>, Error> { let mut keys = packages(document)?; @@ -85,7 +91,17 @@ impl PackageResolver { // The registry resolver will error on missing package #[cfg(feature = "registry")] if !keys.is_empty() { - let reg_packages = self.registry.resolve(&keys).await?; + if self.registry.is_none() { + self.registry = Some( + wac_resolver::RegistryPackageResolver::new( + None, + Some(Box::new(progress::ProgressBar::new())), + ) + .await + .map_err(Error::RegistryClientFailed)?, + ); + } + let reg_packages = self.registry.as_ref().unwrap().resolve(&keys).await?; keys.retain(|key, _| !reg_packages.contains_key(key)); packages.extend(reg_packages); }