rez_next_version/
range.rs

1//! Version range implementation
2
3use super::Version;
4use rez_next_common::RezCoreError;
5use serde::{Deserialize, Serialize};
6
7/// Version range representation
8#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
9pub struct VersionRange {
10    /// Cached string representation
11    pub range_str: String,
12}
13
14impl VersionRange {
15    /// Create a new version range from a string
16    pub fn new(range_str: String) -> Result<Self, RezCoreError> {
17        Self::parse(&range_str)
18    }
19
20    /// Parse a version range string
21    pub fn parse(range_str: &str) -> Result<Self, RezCoreError> {
22        // For now, implement basic parsing
23        // This is a simplified implementation
24        Ok(VersionRange {
25            range_str: range_str.to_string(),
26        })
27    }
28
29    /// Check if a version satisfies this range
30    pub fn contains(&self, _version: &Version) -> bool {
31        // Simplified implementation - always returns true for now
32        true
33    }
34
35    /// Get the string representation
36    pub fn as_str(&self) -> &str {
37        &self.range_str
38    }
39
40    /// Check if this range intersects with another range
41    pub fn intersects(&self, _other: &VersionRange) -> bool {
42        // Simplified implementation - always returns true for now
43        true
44    }
45
46    /// Compute the intersection of two ranges
47    pub fn intersect(&self, _other: &VersionRange) -> Option<VersionRange> {
48        // Simplified implementation - return the first range
49        Some(self.clone())
50    }
51
52    /// Check if this range is the "any" range (matches all versions)
53    pub fn is_any(&self) -> bool {
54        self.range_str.is_empty()
55    }
56}
57
58#[cfg(test)]
59mod tests {
60    use super::*;
61
62    #[test]
63    fn test_version_range_parsing() {
64        // Test empty range (any)
65        let range = VersionRange::parse("").unwrap();
66        assert!(range.is_any());
67
68        // Test exact version
69        let range = VersionRange::parse("==1.0.0").unwrap();
70        assert_eq!(range.range_str, "==1.0.0");
71
72        // Test greater than or equal
73        let range = VersionRange::parse(">=1.0.0").unwrap();
74        assert_eq!(range.range_str, ">=1.0.0");
75    }
76
77    #[test]
78    fn test_version_range_intersect() {
79        let range1 = VersionRange::parse(">=1.0.0").unwrap();
80        let range2 = VersionRange::parse("<=2.0.0").unwrap();
81
82        let intersection = range1.intersect(&range2).unwrap();
83        assert_eq!(intersection.range_str, ">=1.0.0");
84    }
85}