semver_php/
comparator.rs

1//! Version comparison utilities.
2//!
3//! Provides functions to compare two versions using Composer's semver semantics.
4
5use crate::{
6	constraint::{Operator, SingleConstraint},
7	error::Result,
8	parser::VersionParser,
9};
10
11/// Compare two versions using the specified operator.
12///
13/// # Arguments
14/// * `version1` - First version string (will be normalized)
15/// * `operator` - Comparison operator (">", ">=", "<", "<=", "==", "=", "!=", "<>")
16/// * `version2` - Second version string (will be normalized)
17///
18/// # Returns
19/// `true` if the comparison holds, `false` otherwise.
20///
21/// # Errors
22/// Returns an error if either version string is invalid.
23pub fn compare(version1: &str, operator: &str, version2: &str) -> Result<bool> {
24	let v1_normalized = VersionParser::normalize(version1)?;
25	let v2_normalized = VersionParser::normalize(version2)?;
26
27	let op = Operator::parse(operator)?;
28	let constraint = SingleConstraint::new(op, &v2_normalized);
29	let provider = SingleConstraint::new(Operator::Eq, &v1_normalized);
30
31	Ok(constraint.match_specific(&provider, true))
32}
33
34/// Check if version1 > version2.
35///
36/// # Errors
37/// Returns an error if either version string is invalid.
38pub fn greater_than(version1: &str, version2: &str) -> Result<bool> {
39	compare(version1, ">", version2)
40}
41
42/// Check if version1 >= version2.
43///
44/// # Errors
45/// Returns an error if either version string is invalid.
46pub fn greater_than_or_equal_to(version1: &str, version2: &str) -> Result<bool> {
47	compare(version1, ">=", version2)
48}
49
50/// Check if version1 < version2.
51///
52/// # Errors
53/// Returns an error if either version string is invalid.
54pub fn less_than(version1: &str, version2: &str) -> Result<bool> {
55	compare(version1, "<", version2)
56}
57
58/// Check if version1 <= version2.
59///
60/// # Errors
61/// Returns an error if either version string is invalid.
62pub fn less_than_or_equal_to(version1: &str, version2: &str) -> Result<bool> {
63	compare(version1, "<=", version2)
64}
65
66/// Check if version1 == version2.
67///
68/// # Errors
69/// Returns an error if either version string is invalid.
70pub fn equal_to(version1: &str, version2: &str) -> Result<bool> {
71	compare(version1, "==", version2)
72}
73
74/// Check if version1 != version2.
75///
76/// # Errors
77/// Returns an error if either version string is invalid.
78pub fn not_equal_to(version1: &str, version2: &str) -> Result<bool> {
79	compare(version1, "!=", version2)
80}
81
82#[cfg(test)]
83mod tests {
84	use super::*;
85
86	#[test]
87	fn test_greater_than() {
88		assert!(greater_than("1.25.0", "1.24.0").unwrap());
89		assert!(!greater_than("1.25.0", "1.25.0").unwrap());
90		assert!(!greater_than("1.25.0", "1.26.0").unwrap());
91	}
92
93	#[test]
94	fn test_less_than() {
95		assert!(!less_than("1.25.0", "1.24.0").unwrap());
96		assert!(!less_than("1.25.0", "1.25.0").unwrap());
97		assert!(less_than("1.25.0", "1.26.0").unwrap());
98	}
99
100	#[test]
101	fn test_equal_to() {
102		assert!(!equal_to("1.25.0", "1.24.0").unwrap());
103		assert!(equal_to("1.25.0", "1.25.0").unwrap());
104		assert!(!equal_to("1.25.0", "1.26.0").unwrap());
105	}
106}