Skip to main content

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