xrpl/utils/
mod.rs

1//! Convenience utilities for the XRP Ledger
2
3pub mod exceptions;
4#[cfg(feature = "models")]
5pub mod get_nftoken_id;
6#[cfg(feature = "models")]
7pub mod get_xchain_claim_id;
8#[cfg(feature = "models")]
9pub mod parse_nftoken_id;
10pub mod str_conversion;
11#[cfg(test)]
12pub mod testing;
13pub mod time_conversion;
14#[cfg(feature = "models")]
15pub(crate) mod transactions;
16#[cfg(feature = "models")]
17pub mod txn_parser;
18pub mod xrpl_conversion;
19
20pub use self::time_conversion::*;
21pub use self::xrpl_conversion::*;
22
23use crate::constants::*;
24use alloc::vec::Vec;
25use regex::Regex;
26
27/// Determine if the address string is a hex address.
28///
29/// # Examples
30///
31/// ## Basic usage
32///
33/// ```
34/// use xrpl::utils::is_hex_address;
35///
36/// let value: &str = "5E7B112523F68D2F5E879DB4EAC51C6698A69304";
37///
38/// assert!(is_hex_address(value));
39/// ```
40pub fn is_hex_address(value: &str) -> bool {
41    let regex = Regex::new(HEX_CURRENCY_REGEX).expect("is_hex_address");
42    regex.is_match(value)
43}
44
45/// Tests if value is a valid 3-char iso code.
46///
47/// # Examples
48///
49/// ## Basic usage
50///
51/// ```
52/// use xrpl::utils::is_iso_code;
53///
54/// let value: &str = "USD";
55///
56/// assert!(is_iso_code(value));
57/// ```
58pub fn is_iso_code(value: &str) -> bool {
59    let regex = Regex::new(ISO_CURRENCY_REGEX).expect("is_iso_code");
60    regex.is_match(value)
61}
62
63/// Tests if value is a valid 40-char hex currency string.
64///
65/// # Examples
66///
67/// ## Basic usage
68///
69/// ```
70/// use xrpl::utils::is_iso_hex;
71///
72/// let value: &str = "0000000000000000000000005553440000000000";
73///
74/// assert!(is_iso_hex(value));
75/// ```
76pub fn is_iso_hex(value: &str) -> bool {
77    let regex = Regex::new(HEX_CURRENCY_REGEX).expect("_is_hex");
78    regex.is_match(value)
79}
80
81/// Converter to byte array with endianness.
82pub trait ToBytes {
83    /// Return the byte array of self.
84    fn to_bytes(&self) -> Vec<u8>;
85}
86
87#[cfg(test)]
88mod test {
89    use super::*;
90
91    const HEX_ENCODING: &str = "5E7B112523F68D2F5E879DB4EAC51C6698A69304";
92
93    #[test]
94    fn test_is_hex_address() {
95        assert!(is_hex_address(HEX_ENCODING));
96    }
97
98    #[test]
99    fn test_is_iso_code() {
100        let valid_code = "ABC";
101        let valid_code_numeric = "123";
102        let invalid_code_long = "LONG";
103        let invalid_code_short = "NO";
104
105        assert!(is_iso_code(valid_code));
106        assert!(is_iso_code(valid_code_numeric));
107        assert!(!is_iso_code(invalid_code_long));
108        assert!(!is_iso_code(invalid_code_short));
109    }
110
111    #[test]
112    fn test_is_hex() {
113        // Valid = 40 char length and only valid hex chars
114        let valid_hex: &str = "0000000000000000000000005553440000000000";
115        let invalid_hex_chars: &str = "USD0000000000000000000005553440000000000";
116        let invalid_hex_long: &str = "0000000000000000000000005553440000000000123455";
117        let invalid_hex_short: &str = "1234";
118
119        assert!(is_iso_hex(valid_hex));
120        assert!(!is_iso_hex(invalid_hex_long));
121        assert!(!is_iso_hex(invalid_hex_short));
122        assert!(!is_iso_hex(invalid_hex_chars));
123    }
124}