hermes_five/utils/
range.rs

1#[derive(Copy, Clone, PartialEq, Debug)]
2pub struct Range<T> {
3    pub start: T,
4    pub end: T,
5}
6
7impl<T: Copy> From<[T; 2]> for Range<T> {
8    fn from(value: [T; 2]) -> Self {
9        Self {
10            start: value[0],
11            end: value[1],
12        }
13    }
14}
15
16#[cfg(feature = "serde")]
17impl<T> serde::Serialize for Range<T>
18where
19    T: serde::Serialize + Copy,
20{
21    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
22    where
23        S: serde::Serializer,
24    {
25        // Serialize the Range as an array [start, end]
26        [self.start, self.end].serialize(serializer)
27    }
28}
29
30#[cfg(feature = "serde")]
31impl<'de, T> serde::Deserialize<'de> for Range<T>
32where
33    T: serde::Deserialize<'de> + Copy,
34{
35    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
36    where
37        D: serde::Deserializer<'de>,
38    {
39        // Deserialize from an array [start, end]
40        let array: [T; 2] = serde::Deserialize::deserialize(deserializer)?;
41        Ok(Self::from(array))
42    }
43}
44
45#[cfg(test)]
46mod tests {
47    use super::*;
48
49    #[test]
50    fn test_range_creation() {
51        let range = Range { start: 10, end: 20 };
52        assert_eq!(range.start, 10);
53        assert_eq!(range.end, 20);
54    }
55
56    #[test]
57    fn test_range_from_array() {
58        let array = [5, 15];
59        let range: Range<u8> = array.into();
60        assert_eq!(range.start, 5);
61        assert_eq!(range.end, 15);
62    }
63
64    #[test]
65    fn test_range_copy_clone() {
66        let range1 = Range { start: 2, end: 8 };
67        let range2 = range1; // Copy
68        #[allow(clippy::clone_on_copy)]
69        let range3 = range1.clone(); // Clone
70
71        assert_eq!(range1.start, range2.start);
72        assert_eq!(range1.end, range2.end);
73        assert_eq!(range1.start, range3.start);
74        assert_eq!(range1.end, range3.end);
75    }
76
77    #[test]
78    fn test_range_equality() {
79        let range1 = Range { start: 3, end: 9 };
80        let range2 = Range { start: 3, end: 9 };
81        assert_eq!(range1, range2);
82        let range3 = Range { start: 3, end: 10 };
83        assert_ne!(range1, range3);
84        let range4 = Range { start: 4, end: 10 };
85        assert_ne!(range1, range4);
86    }
87
88    #[test]
89    fn test_range_debug() {
90        let range = Range { start: 4, end: 10 };
91        let debug_str = format!("{:?}", range);
92        assert_eq!(debug_str, "Range { start: 4, end: 10 }");
93    }
94}
95
96#[cfg(feature = "serde")]
97#[cfg(test)]
98mod serde_tests {
99    use serde_json;
100
101    use super::*;
102
103    #[test]
104    fn test_range_serialize() {
105        let range = Range { start: 6, end: 12 };
106        let json = serde_json::to_string(&range);
107        assert!(json.is_ok());
108        assert_eq!(json.unwrap(), r#"[6,12]"#);
109    }
110
111    #[test]
112    fn test_range_deserialize() {
113        let json = r#"[7,14]"#;
114        let range = serde_json::from_str(json);
115        assert!(range.is_ok());
116        let range: Range<u8> = range.unwrap();
117        assert_eq!(range.start, 7);
118        assert_eq!(range.end, 14);
119
120        let json_wrong = r#"[7,8,14]"#;
121        assert!(serde_json::from_str::<Range<u8>>(json_wrong).is_err());
122    }
123}