From a1886c620e1d71ca66a3a14a083369fe59c60312 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Mon, 6 Nov 2023 15:48:37 -0600 Subject: [PATCH] refactor(util): Unify VersionExt, VersionReqExt For myself, I find the trait-as-a-constructor approach of `VersionReqExt::exact` awkward and find merging it into `VersionExt` as `VersionExt::to_exact_req` is a bit cleaner. For example, this would make it easier to integrate with `PartialVersion` if we want. --- src/bin/cargo/commands/install.rs | 6 +++--- src/cargo/util/mod.rs | 2 +- src/cargo/util/semver_ext.rs | 20 ++++++++------------ 3 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/bin/cargo/commands/install.rs b/src/bin/cargo/commands/install.rs index 016ba5d5ce5..143ae517cff 100644 --- a/src/bin/cargo/commands/install.rs +++ b/src/bin/cargo/commands/install.rs @@ -6,7 +6,7 @@ use anyhow::format_err; use cargo::core::{GitReference, SourceId, Workspace}; use cargo::ops; use cargo::util::IntoUrl; -use cargo::util::VersionReqExt; +use cargo::util::VersionExt; use cargo::CargoResult; use itertools::Itertools; use semver::VersionReq; @@ -263,8 +263,8 @@ fn parse_semver_flag(v: &str) -> CargoResult { ), } } else { - match v.trim().parse() { - Ok(v) => Ok(VersionReq::exact(&v)), + match v.trim().parse::() { + Ok(v) => Ok(v.to_exact_req()), Err(e) => { let mut msg = e.to_string(); diff --git a/src/cargo/util/mod.rs b/src/cargo/util/mod.rs index 3a30bcb39c2..e72dde14e91 100644 --- a/src/cargo/util/mod.rs +++ b/src/cargo/util/mod.rs @@ -22,7 +22,7 @@ pub use self::progress::{Progress, ProgressStyle}; pub use self::queue::Queue; pub use self::restricted_names::validate_package_name; pub use self::rustc::Rustc; -pub use self::semver_ext::{OptVersionReq, PartialVersion, RustVersion, VersionExt, VersionReqExt}; +pub use self::semver_ext::{OptVersionReq, PartialVersion, RustVersion, VersionExt}; pub use self::vcs::{existing_vcs_repo, FossilRepo, GitRepo, HgRepo, PijulRepo}; pub use self::workspace::{ add_path_args, path_args, print_available_benches, print_available_binaries, diff --git a/src/cargo/util/semver_ext.rs b/src/cargo/util/semver_ext.rs index 7863ba15d1f..86f0b19245e 100644 --- a/src/cargo/util/semver_ext.rs +++ b/src/cargo/util/semver_ext.rs @@ -14,27 +14,23 @@ pub enum OptVersionReq { pub trait VersionExt { fn is_prerelease(&self) -> bool; -} -pub trait VersionReqExt { - fn exact(version: &Version) -> Self; + fn to_exact_req(&self) -> VersionReq; } impl VersionExt for Version { fn is_prerelease(&self) -> bool { !self.pre.is_empty() } -} -impl VersionReqExt for VersionReq { - fn exact(version: &Version) -> Self { + fn to_exact_req(&self) -> VersionReq { VersionReq { comparators: vec![Comparator { op: Op::Exact, - major: version.major, - minor: Some(version.minor), - patch: Some(version.patch), - pre: version.pre.clone(), + major: self.major, + minor: Some(self.minor), + patch: Some(self.patch), + pre: self.pre.clone(), }], } } @@ -42,14 +38,14 @@ impl VersionReqExt for VersionReq { impl OptVersionReq { pub fn exact(version: &Version) -> Self { - OptVersionReq::Req(VersionReq::exact(version)) + OptVersionReq::Req(version.to_exact_req()) } // Since some registries have allowed crate versions to differ only by build metadata, // A query using OptVersionReq::exact return nondeterministic results. // So we `lock_to` the exact version were interested in. pub fn lock_to_exact(version: &Version) -> Self { - OptVersionReq::Locked(version.clone(), VersionReq::exact(version)) + OptVersionReq::Locked(version.clone(), version.to_exact_req()) } pub fn is_exact(&self) -> bool {