From c916814e7ed8f2fa3e56ef0d2f0454a93f724186 Mon Sep 17 00:00:00 2001 From: Jiahao XU Date: Tue, 21 Jun 2022 13:40:36 +1000 Subject: [PATCH] Refactor: Extract `find_version` into mod Signed-off-by: Jiahao XU --- src/drivers.rs | 45 ++------------------------------------- src/drivers/version.rs | 48 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 43 deletions(-) create mode 100644 src/drivers/version.rs diff --git a/src/drivers.rs b/src/drivers.rs index b5dff09a..9a56a7d3 100644 --- a/src/drivers.rs +++ b/src/drivers.rs @@ -1,11 +1,9 @@ -use std::collections::BTreeSet; use std::path::{Path, PathBuf}; use std::time::Duration; use cargo_toml::Manifest; use crates_io_api::AsyncClient; use log::debug; -use semver::{Version, VersionReq}; use url::Url; use crate::{helpers::*, BinstallError, Meta, TarBasedFmt}; @@ -15,47 +13,8 @@ mod vfs; mod visitor; use visitor::ManifestVisitor; -fn find_version<'a, V: Iterator>( - requirement: &str, - version_iter: V, -) -> Result { - // Parse version requirement - let version_req = VersionReq::parse(requirement).map_err(|err| BinstallError::VersionReq { - req: requirement.into(), - err, - })?; - - // Filter for matching versions - let filtered: BTreeSet<_> = version_iter - .filter_map(|v| { - // Remove leading `v` for git tags - let ver_str = match v.strip_prefix('s') { - Some(v) => v, - None => v, - }; - - // Parse out version - let ver = Version::parse(ver_str).ok()?; - debug!("Version: {:?}", ver); - - // Filter by version match - if version_req.matches(&ver) { - Some(ver) - } else { - None - } - }) - .collect(); - - debug!("Filtered: {:?}", filtered); - - // Return highest version - filtered - .iter() - .max() - .cloned() - .ok_or(BinstallError::VersionMismatch { req: version_req }) -} +mod version; +use version::find_version; /// Fetch a crate Cargo.toml by name and version from crates.io pub async fn fetch_crate_cratesio( diff --git a/src/drivers/version.rs b/src/drivers/version.rs new file mode 100644 index 00000000..7d5f4a74 --- /dev/null +++ b/src/drivers/version.rs @@ -0,0 +1,48 @@ +use std::collections::BTreeSet; + +use log::debug; +use semver::{Version, VersionReq}; + +use crate::BinstallError; + +pub(super) fn find_version<'a, V: Iterator>( + requirement: &str, + version_iter: V, +) -> Result { + // Parse version requirement + let version_req = VersionReq::parse(requirement).map_err(|err| BinstallError::VersionReq { + req: requirement.into(), + err, + })?; + + // Filter for matching versions + let filtered: BTreeSet<_> = version_iter + .filter_map(|v| { + // Remove leading `v` for git tags + let ver_str = match v.strip_prefix('s') { + Some(v) => v, + None => v, + }; + + // Parse out version + let ver = Version::parse(ver_str).ok()?; + debug!("Version: {:?}", ver); + + // Filter by version match + if version_req.matches(&ver) { + Some(ver) + } else { + None + } + }) + .collect(); + + debug!("Filtered: {:?}", filtered); + + // Return highest version + filtered + .iter() + .max() + .cloned() + .ok_or(BinstallError::VersionMismatch { req: version_req }) +}