diff --git a/Cargo.lock b/Cargo.lock index 33d0a1a0..176871aa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -177,6 +177,7 @@ dependencies = [ "home", "itertools", "jobslot", + "maybe-owned", "miette", "normalize-path", "once_cell", diff --git a/crates/binstalk/Cargo.toml b/crates/binstalk/Cargo.toml index 218eab48..01bfa0cd 100644 --- a/crates/binstalk/Cargo.toml +++ b/crates/binstalk/Cargo.toml @@ -23,6 +23,7 @@ futures-util = { version = "0.3.25", default-features = false, features = ["std" home = "0.5.4" itertools = "0.10.5" jobslot = { version = "0.2.8", features = ["tokio"] } +maybe-owned = "0.3.4" miette = "5.5.0" normalize-path = { version = "0.2.0", path = "../normalize-path" } once_cell = "1.17.0" diff --git a/crates/binstalk/src/ops/resolve.rs b/crates/binstalk/src/ops/resolve.rs index 7fa725ac..1e5c5f03 100644 --- a/crates/binstalk/src/ops/resolve.rs +++ b/crates/binstalk/src/ops/resolve.rs @@ -10,6 +10,7 @@ use cargo_toml::Manifest; use compact_str::{CompactString, ToCompactString}; use crates_io_api::AsyncClient as CratesIoApiClient; use itertools::Itertools; +use maybe_owned::MaybeOwned; use semver::{Version, VersionReq}; use tokio::task::block_in_place; use tracing::{debug, info, instrument, warn}; @@ -57,11 +58,11 @@ async fn resolve_inner( ) -> Result { info!("Resolving package: '{}'", crate_name); - let version_req: VersionReq = match (crate_name.version_req, &opts.version_req) { - (Some(version), None) => version, - (None, Some(version)) => version.clone(), + let version_req = match (&crate_name.version_req, &opts.version_req) { + (Some(version), None) => MaybeOwned::Borrowed(version), + (None, Some(version)) => MaybeOwned::Borrowed(version), (Some(_), Some(_)) => Err(BinstallError::SuperfluousVersionOption)?, - (None, None) => VersionReq::STAR, + (None, None) => MaybeOwned::Owned(VersionReq::STAR), }; let version_req_str = version_req.to_compact_string(); @@ -69,7 +70,7 @@ async fn resolve_inner( let Some(package_info) = PackageInfo::resolve(&opts, crate_name.name, curr_version, - version_req, + &version_req, opts.client.clone(), &opts.crates_io_api_client).await? else { @@ -337,7 +338,7 @@ impl PackageInfo { opts: &Options, name: CompactString, curr_version: Option, - version_req: VersionReq, + version_req: &VersionReq, client: Client, crates_io_api_client: &CratesIoApiClient, ) -> Result, BinstallError> { @@ -349,7 +350,7 @@ impl PackageInfo { client, crates_io_api_client, &name, - &version_req, + version_req, )) .await? }