novax_token/utils/
mod.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
use crate::error::token::TokenError;

pub(crate) fn parse_identifier(token_identifier: &str) -> Result<(String, u64), TokenError> {
    let parts = token_identifier.split('-').collect::<Vec<&str>>();
    let parts_len = parts.len();

    let (identifier, nonce) = if parts_len == 2 || parts_len == 3 {
        let identifier = format!("{}-{}", parts[0], parts[1]);

        let nonce = if parts_len == 2 {
            0
        } else {
            let Ok(nonce) = u64::from_str_radix(parts[2], 16) else {
                return Err(TokenError::InvalidTokenIdentifier { identifier: token_identifier.to_string() })
            };

            nonce
        };

        (identifier, nonce)
    } else {
        return Err(TokenError::InvalidTokenIdentifier { identifier: token_identifier.to_string() })
    };

    Ok((identifier, nonce))
}

#[cfg(test)]
mod tests {
    use crate::error::token::TokenError;
    use crate::utils::parse_identifier;

    #[test]
    fn test_valid_fungible() {
        let result = parse_identifier("WEGLD-abcdef").unwrap();

        let expected = ("WEGLD-abcdef".to_string(), 0u64);

        assert_eq!(result, expected)
    }

    #[test]
    fn test_valid_non_fungible() {
        let result = parse_identifier("LKMEX-abcdef-09").unwrap();

        let expected = ("LKMEX-abcdef".to_string(), 9u64);

        assert_eq!(result, expected)
    }

    #[test]
    fn test_valid_non_fungible_hex_uppercase_nonce() {
        let result = parse_identifier("LKMEX-abcdef-9F2").unwrap();

        let expected = ("LKMEX-abcdef".to_string(), 2546u64);

        assert_eq!(result, expected)
    }

    #[test]
    fn test_valid_non_fungible_hex_lowercase_nonce() {
        let result = parse_identifier("LKMEX-abcdef-9f2").unwrap();

        let expected = ("LKMEX-abcdef".to_string(), 2546u64);

        assert_eq!(result, expected)
    }

    #[test]
    fn test_non_fungible_invalid_hex_nonce() {
        let result = parse_identifier("LKMEX-abcdef-test").unwrap_err();

        let expected: TokenError = TokenError::InvalidTokenIdentifier { identifier: "LKMEX-abcdef-test".to_string() };

        assert_eq!(result, expected)
    }

    #[test]
    fn test_too_short_identifier() {
        let result = parse_identifier("WEGLD").unwrap_err();

        let expected: TokenError = TokenError::InvalidTokenIdentifier { identifier: "WEGLD".to_string() };

        assert_eq!(result, expected)
    }

    #[test]
    fn test_too_long_identifier() {
        let result = parse_identifier("WEGLD-abcdef-05-a").unwrap_err();

        let expected: TokenError = TokenError::InvalidTokenIdentifier { identifier: "WEGLD-abcdef-05-a".to_string() };

        assert_eq!(result, expected)
    }
}