types.rs (2796B)
1 #[cfg(not(feature = "std"))] 2 use alloc::string::String; 3 4 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 5 #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] 6 pub struct RadrootsEventsIndexedShardId(pub String); 7 8 #[cfg_attr(feature = "dto-bindgen", derive(dto_bindgen::Dto))] 9 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 10 #[derive(Clone, Debug, PartialEq, Eq)] 11 pub struct RadrootsEventsIndexedIdRange { 12 pub start: String, 13 pub end: String, 14 } 15 16 impl RadrootsEventsIndexedIdRange { 17 pub fn is_valid(&self) -> bool { 18 if self.start.is_empty() || self.end.is_empty() { 19 return false; 20 } 21 if self.start.len() != self.end.len() { 22 return false; 23 } 24 if !self.start.chars().all(|c| c.is_ascii_hexdigit()) 25 || !self.end.chars().all(|c| c.is_ascii_hexdigit()) 26 { 27 return false; 28 } 29 self.start <= self.end 30 } 31 } 32 33 #[cfg(test)] 34 mod tests { 35 use super::RadrootsEventsIndexedIdRange; 36 #[cfg(not(feature = "std"))] 37 use alloc::string::String; 38 #[cfg(feature = "std")] 39 use std::string::String; 40 41 #[test] 42 fn id_range_rejects_non_hex() { 43 let range = RadrootsEventsIndexedIdRange { 44 start: String::from("zz"), 45 end: String::from("ff"), 46 }; 47 assert!(!range.is_valid()); 48 } 49 50 #[test] 51 fn id_range_rejects_mismatched_length() { 52 let range = RadrootsEventsIndexedIdRange { 53 start: String::from("0a"), 54 end: String::from("0aa"), 55 }; 56 assert!(!range.is_valid()); 57 } 58 59 #[test] 60 fn id_range_rejects_reverse_order() { 61 let range = RadrootsEventsIndexedIdRange { 62 start: String::from("0f"), 63 end: String::from("0a"), 64 }; 65 assert!(!range.is_valid()); 66 } 67 68 #[test] 69 fn id_range_accepts_hex_order() { 70 let range = RadrootsEventsIndexedIdRange { 71 start: String::from("0a"), 72 end: String::from("0f"), 73 }; 74 assert!(range.is_valid()); 75 } 76 77 #[test] 78 fn id_range_rejects_empty_bounds() { 79 let range = RadrootsEventsIndexedIdRange { 80 start: String::new(), 81 end: String::from("0f"), 82 }; 83 assert!(!range.is_valid()); 84 } 85 86 #[test] 87 fn id_range_rejects_empty_end() { 88 let range = RadrootsEventsIndexedIdRange { 89 start: String::from("0f"), 90 end: String::new(), 91 }; 92 assert!(!range.is_valid()); 93 } 94 95 #[test] 96 fn id_range_rejects_non_hex_end() { 97 let range = RadrootsEventsIndexedIdRange { 98 start: String::from("0f"), 99 end: String::from("zz"), 100 }; 101 assert!(!range.is_valid()); 102 } 103 }