xmtp_common/
hex.rs

1pub trait NormalizeHex {
2    fn normalize_hex(&self) -> String;
3}
4
5impl NormalizeHex for str {
6    fn normalize_hex(&self) -> String {
7        let lower = self.to_lowercase();
8        lower.strip_prefix("0x").unwrap_or(&lower).to_string()
9    }
10}
11
12impl NormalizeHex for String {
13    fn normalize_hex(&self) -> String {
14        self.as_str().normalize_hex()
15    }
16}
17
18#[cfg(test)]
19mod tests {
20    use super::*;
21
22    #[test]
23    fn test_normalize_hex_str_with_mixed_case_prefix() {
24        assert_eq!("0xABCDEF".normalize_hex(), "abcdef");
25        assert_eq!("0XAbCdEf".normalize_hex(), "abcdef");
26        assert_eq!("0xAbC123".normalize_hex(), "abc123");
27    }
28
29    #[test]
30    fn test_normalize_hex_str_without_prefix() {
31        assert_eq!("abcdef".normalize_hex(), "abcdef");
32        assert_eq!("123456".normalize_hex(), "123456");
33        assert_eq!("ABCDEF".normalize_hex(), "abcdef");
34        assert_eq!("AbCdEf".normalize_hex(), "abcdef");
35    }
36
37    #[test]
38    fn test_normalize_hex_str_already_normalized() {
39        assert_eq!("abcdef123456".normalize_hex(), "abcdef123456");
40        assert_eq!("0".normalize_hex(), "0");
41        assert_eq!("ff".normalize_hex(), "ff");
42    }
43
44    #[test]
45    fn test_normalize_hex_str_edge_cases() {
46        assert_eq!("".normalize_hex(), "");
47        assert_eq!("0x".normalize_hex(), "");
48        assert_eq!("0X".normalize_hex(), "");
49        assert_eq!("x".normalize_hex(), "x");
50        assert_eq!("0".normalize_hex(), "0");
51    }
52}