stellar_notation/
decode.rs

1
2use std::error::Error;
3use std::str;
4use std::convert::TryInto;
5use std::num::ParseIntError;
6
7pub fn as_u8(val: &str) -> Result<u8, Box<dyn Error>> {
8    let res = u8::from_le_bytes(decode_hex(val)?[..].try_into().unwrap());
9    Ok(res)
10}
11
12pub fn as_u16(val: &str) -> Result<u16, Box<dyn Error>> {
13    let res = u16::from_le_bytes(decode_hex(val)?[..].try_into().unwrap());
14    Ok(res)
15}
16
17pub fn as_u32(val: &str) -> Result<u32, Box<dyn Error>> {
18    let res = u32::from_le_bytes(decode_hex(val)?[..].try_into().unwrap());
19    Ok(res)
20}
21
22pub fn as_u64(val: &str) -> Result<u64, Box<dyn Error>> {
23    let res = u64::from_le_bytes(decode_hex(val)?[..].try_into().unwrap());
24    Ok(res)
25}
26
27pub fn as_u128(val: &str) -> Result<u128, Box<dyn Error>> {
28    let res = u128::from_le_bytes(decode_hex(val)?[..].try_into().unwrap());
29    Ok(res)
30}
31
32pub fn as_bytes(val: &str) -> Result<Vec<u8>, Box<dyn Error>> {
33    let res = decode_hex(val)?;
34    Ok(res)
35}
36
37pub fn as_list(val: &str) -> Result<Vec<String>, Box<dyn Error>> {
38
39    let bytes = as_bytes(val)?;
40    
41    let mut list: Vec<String> = Vec::new();
42
43    let mut i = 0;
44
45    while i < bytes.len() {
46
47        let item_length_size: usize = u8::from_le_bytes([bytes[i]; 1]) as usize;
48        i += 1;
49
50        match item_length_size {
51
52            1 => {
53
54                let item_length: usize = u8::from_le_bytes([bytes[i]; 1]) as usize;
55                i += 1;
56
57                let item_string: String = str::from_utf8(&bytes[i..i + item_length])?.to_string();
58                i += item_length;
59
60                list.push(item_string)
61
62            },
63
64            2 => {
65
66                let item_length: usize = u16::from_le_bytes([bytes[i], bytes[i + 1]]) as usize;
67                i += 2;
68
69                let item_string: String = str::from_utf8(&bytes[i..i + item_length])?.to_string();
70                i += item_length;
71
72                list.push(item_string)
73
74            },
75
76            4 => {
77
78                let item_length: usize = u32::from_le_bytes([bytes[i], bytes[i + 1], bytes[i + 2], bytes[i + 3]]) as usize;
79                i += 4;
80
81                let item_string: String = str::from_utf8(&bytes[i..i + item_length])?.to_string();
82                i += item_length;
83
84                list.push(item_string)
85
86            },
87
88            8 => {
89
90                let value_length: usize = u64::from_le_bytes([bytes[i], bytes[i + 1], bytes[i + 2], bytes[i + 3], bytes[i + 4], bytes[i + 5], bytes[i + 6], bytes[i + 7]]) as usize;
91                i += 8;
92
93                let item_string: String = str::from_utf8(&bytes[i..i + value_length])?.to_string();
94                i += value_length;
95
96                list.push(item_string)
97
98            },
99
100            _ => ()
101
102        }
103
104    }
105
106    Ok(list)
107
108
109}
110
111fn decode_hex(s: &str) -> Result<Vec<u8>, ParseIntError> {
112    (2..s.len())
113        .step_by(2)
114        .map(|i| u8::from_str_radix(&s[i..i + 2], 16))
115        .collect()
116}