diff --git a/src/atom/mod.rs b/src/atom/mod.rs index 4516410..97c57f7 100644 --- a/src/atom/mod.rs +++ b/src/atom/mod.rs @@ -329,6 +329,7 @@ impl PartialEq for Version { fn eq(&self, other: &Self) -> bool { self.numbers == other.numbers && self.suffixes == other.suffixes + && self.letter == other.letter && match (&self.rev, &other.rev) { (Some(a), Some(b)) => { a.get().parse::().unwrap() == b.get().parse::().unwrap() @@ -353,24 +354,38 @@ impl PartialOrd for Version { impl Ord for Version { fn cmp(&self, other: &Self) -> Ordering { match self.numbers.cmp(&other.numbers) { - Ordering::Less => Ordering::Less, - Ordering::Greater => Ordering::Greater, - Ordering::Equal => match self.suffixes.cmp(&other.suffixes) { - Ordering::Less => Ordering::Less, - Ordering::Greater => Ordering::Greater, - Ordering::Equal => match (&self.rev, &other.rev) { - (Some(a), Some(b)) => a - .get() - .parse::() - .unwrap() - .cmp(&b.get().parse().unwrap()), - (Some(a), None) if a.get().chars().all(|c| c == '0') => Ordering::Equal, - (Some(_), None) => Ordering::Greater, - (None, Some(b)) if b.get().chars().all(|c| c == '0') => Ordering::Equal, - (None, Some(_)) => Ordering::Less, - (None, None) => Ordering::Equal, - }, - }, + Ordering::Less => return Ordering::Less, + Ordering::Greater => return Ordering::Greater, + Ordering::Equal => (), + } + + match self.suffixes.cmp(&other.suffixes) { + Ordering::Less => return Ordering::Less, + Ordering::Greater => return Ordering::Greater, + Ordering::Equal => (), + } + + match (self.letter, other.letter) { + (Some(a), Some(b)) if a < b => return Ordering::Less, + (Some(a), Some(b)) if a > b => return Ordering::Greater, + (Some(a), Some(b)) if a == b => (), + (Some(_), None) => return Ordering::Greater, + (None, Some(_)) => return Ordering::Less, + (None, None) => (), + _ => unreachable!(), + }; + + match (&self.rev, &other.rev) { + (Some(a), Some(b)) => a + .get() + .parse::() + .unwrap() + .cmp(&b.get().parse().unwrap()), + (Some(a), None) if a.get().chars().all(|c| c == '0') => Ordering::Equal, + (Some(_), None) => Ordering::Greater, + (None, Some(b)) if b.get().chars().all(|c| c == '0') => Ordering::Equal, + (None, Some(_)) => Ordering::Less, + (None, None) => Ordering::Equal, } } } @@ -738,4 +753,16 @@ mod test { assert_partial_cmp_display!(a, b, ordering); } } + + #[test] + fn test_version_cmp_letter() { + let a = Version::parser() + .parse_finished(InputIter::new("1.0.0")) + .unwrap(); + let b = Version::parser() + .parse_finished(InputIter::new("1.0.0a")) + .unwrap(); + + assert_cmp_display!(a, b, Ordering::Less); + } }