hermes_five/utils/
range.rs1#[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 [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 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; #[allow(clippy::clone_on_copy)]
69 let range3 = range1.clone(); 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}