diff --git a/src/drivers.rs b/src/drivers.rs index 8b8f362f..cab8a6d6 100644 --- a/src/drivers.rs +++ b/src/drivers.rs @@ -1,17 +1,60 @@ +use std::collections::BTreeSet; use std::path::{Path, PathBuf}; +use log::debug; +use semver::{Version, VersionReq}; + use crate::BinstallError; mod cratesio; pub use cratesio::*; -mod version; -use version::find_version; - mod vfs; mod visitor; +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 }) +} + /// Fetch a crate by name and version from github /// TODO: implement this pub async fn fetch_crate_gh_releases( diff --git a/src/drivers/version.rs b/src/drivers/version.rs deleted file mode 100644 index 7d5f4a74..00000000 --- a/src/drivers/version.rs +++ /dev/null @@ -1,48 +0,0 @@ -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 }) -}