stellar_notation/
encode.rs

1
2use std::fmt::Write;
3
4pub fn u8(val: &u8) -> String {
5    encode_hex(&val.to_le_bytes().to_vec())
6}
7
8pub fn u16(val: &u16) -> String {
9    encode_hex(&val.to_le_bytes().to_vec())
10}
11
12pub fn u32(val: &u32) -> String {
13    encode_hex(&val.to_le_bytes().to_vec())
14}
15
16pub fn u64(val: &u64) -> String {
17    encode_hex(&val.to_le_bytes().to_vec())
18}
19
20pub fn u128(val: &u128) -> String {
21    encode_hex(&val.to_le_bytes().to_vec())
22}
23
24pub fn bytes(val: &Vec<u8>) -> String {
25    encode_hex(val)
26}
27
28pub fn list(items: &Vec<String>) -> String {
29    
30    let mut bytes: Vec<u8> = Vec::new();
31
32    for i in items {
33
34        let item_bytes: Vec<u8> = i.to_string().into_bytes();
35
36        let item_length: u64 = item_bytes.len() as u64;
37
38        if item_length < 256 {
39
40            let item_length_size = 1_u8.to_le_bytes().to_vec();
41            let u8_item_length: u8 = item_length as u8;
42
43            item_length_size.iter().for_each(|x| bytes.push(*x));
44            u8_item_length.to_le_bytes().to_vec().iter().for_each(|x| bytes.push(*x));
45            
46        } else if item_length < 65536 {
47    
48            let item_length_size = 2_u8.to_le_bytes().to_vec();
49            let u16_item_length: u16 = item_length as u16;
50
51            item_length_size.iter().for_each(|x| bytes.push(*x));
52            u16_item_length.to_le_bytes().to_vec().iter().for_each(|x| bytes.push(*x));
53
54    
55        } else if item_length < 4294967296 {
56    
57            let item_length_size: Vec<u8> = 4_u8.to_le_bytes().to_vec();
58            let u32_item_length: u32 = item_length as u32;
59            
60            item_length_size.iter().for_each(|x| bytes.push(*x));
61            u32_item_length.to_le_bytes().to_vec().iter().for_each(|x| bytes.push(*x));
62    
63        } else {
64    
65            let item_length_size: Vec<u8> = 8_u8.to_le_bytes().to_vec();
66            let u64_item_length: u64 = item_length as u64;
67            
68            item_length_size.iter().for_each(|x| bytes.push(*x));
69            u64_item_length.to_le_bytes().to_vec().iter().for_each(|x| bytes.push(*x));
70    
71        }
72
73        item_bytes.iter().for_each(|x| bytes.push(*x));
74
75    }
76
77    encode_hex(&bytes)
78}
79
80fn encode_hex(bytes: &Vec<u8>) -> String {
81    let mut res = String::with_capacity((bytes.len() * 2) + 2);
82    res.push_str("0X");
83    for &b in bytes {
84        write!(&mut res, "{:02X}", b).unwrap();
85    }
86    res
87}