pub use ::semver::{Version, VersionReq};
#[must_use]
pub fn parse_version(value: &str) -> Option<Version> {
Version::parse(value).ok()
}
#[must_use]
pub fn parse_requirement(requirement: &str) -> Option<VersionReq> {
VersionReq::parse(requirement).ok()
}
#[must_use]
pub fn matches_requirement(version: &str, requirement: &str) -> Option<bool> {
let version = parse_version(version)?;
let requirement = parse_requirement(requirement)?;
Some(requirement.matches(&version))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parses_versions() {
let version = parse_version("1.2.3-alpha.1+build.5").expect("version should parse");
assert_eq!(version.major, 1);
assert_eq!(version.minor, 2);
assert_eq!(version.patch, 3);
assert_eq!(parse_version("1.2"), None);
}
#[test]
fn parses_requirements() {
let requirement = parse_requirement("^1.2").expect("requirement should parse");
assert!(requirement.matches(&Version::parse("1.3.0").expect("version should parse")));
assert_eq!(parse_requirement("not a requirement"), None);
}
#[test]
fn checks_requirement_matches() {
assert_eq!(matches_requirement("1.3.0", ">=1.2"), Some(true));
assert_eq!(matches_requirement("1.1.0", ">=1.2"), Some(false));
assert_eq!(matches_requirement("invalid", ">=1.2"), None);
assert_eq!(matches_requirement("1.3.0", "invalid"), None);
}
}