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