stellar_notation/
decode.rs1
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}