Browse Source

UserVersion: Fix different parsing for leading `v` (#301)

Fixes #298
remotes/origin/add-with-shims
Gal Schlezinger 4 years ago committed by GitHub
parent
commit
652707bf95
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 47
      src/user_version.rs

47
src/user_version.rs

@ -1,4 +1,5 @@
use crate::version::Version; use crate::version::Version;
use std::str::FromStr;
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub enum UserVersion { pub enum UserVersion {
@ -52,7 +53,7 @@ impl UserVersion {
} }
} }
fn next_of<'a, T: std::str::FromStr, It: Iterator<Item = &'a str>>(i: &mut It) -> Option<T> { fn next_of<'a, T: FromStr, It: Iterator<Item = &'a str>>(i: &mut It) -> Option<T> {
let x = i.next()?; let x = i.next()?;
T::from_str(x).ok() T::from_str(x).ok()
} }
@ -67,13 +68,21 @@ impl std::fmt::Display for UserVersion {
} }
} }
impl std::str::FromStr for UserVersion { fn skip_first_v(str: &str) -> &str {
if str.starts_with('v') {
&str[1..]
} else {
str
}
}
impl FromStr for UserVersion {
type Err = semver::SemVerError; type Err = semver::SemVerError;
fn from_str(s: &str) -> Result<UserVersion, Self::Err> { fn from_str(s: &str) -> Result<UserVersion, Self::Err> {
match Version::parse(s) { match Version::parse(s) {
Ok(v) => Ok(Self::Full(v)), Ok(v) => Ok(Self::Full(v)),
Err(e) => { Err(e) => {
let mut parts = s.trim().split('.'); let mut parts = skip_first_v(s.trim()).split('.');
match (next_of::<u64, _>(&mut parts), next_of::<u64, _>(&mut parts)) { match (next_of::<u64, _>(&mut parts), next_of::<u64, _>(&mut parts)) {
(Some(major), None) => Ok(Self::OnlyMajor(major)), (Some(major), None) => Ok(Self::OnlyMajor(major)),
(Some(major), Some(minor)) => Ok(Self::MajorMinor(major, minor)), (Some(major), Some(minor)) => Ok(Self::MajorMinor(major, minor)),
@ -84,10 +93,42 @@ impl std::str::FromStr for UserVersion {
} }
} }
#[cfg(test)]
impl PartialEq for UserVersion {
fn eq(&self, other: &Self) -> bool {
use UserVersion::*;
match (self, other) {
(OnlyMajor(a), OnlyMajor(b)) if a == b => true,
(MajorMinor(a1, a2), MajorMinor(b1, b2)) if (a1, a2) == (b1, b2) => true,
(Full(v1), Full(v2)) if v1 == v2 => true,
(_, _) => false,
}
}
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
#[test]
fn test_parsing_only_major() {
let version = UserVersion::from_str("10").ok();
assert_eq!(version, Some(UserVersion::OnlyMajor(10)));
}
#[test]
fn test_parsing_major_minor() {
let version = UserVersion::from_str("10.20").ok();
assert_eq!(version, Some(UserVersion::MajorMinor(10, 20)));
}
#[test]
fn test_parsing_only_major_with_v() {
let version = UserVersion::from_str("v10").ok();
assert_eq!(version, Some(UserVersion::OnlyMajor(10)));
}
#[test] #[test]
fn test_major_to_version() { fn test_major_to_version() {
let expected = Version::parse("6.1.0").unwrap(); let expected = Version::parse("6.1.0").unwrap();

Loading…
Cancel
Save