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
|
/// Inserts array sizes before every square bracket
///
/// # Example
///
/// If `flat` is "[[0,1], [2,3,4], []]"
/// Output will be "3[2[0,1], 3[2,3,4], 0[]]"
pub fn get_with_sizes(flat: &str) -> String {
let mut values = flat.split('[').map(|x| x.trim()).skip(1);
let current = values.next().unwrap_or(flat);
// 1D collection or not a collection
if current != "" {
let size = 1 + current
.clone()
.to_string()
.chars()
.take_while(|x| *x != ']')
.map(|x| (x == ',') as usize)
.sum::<usize>();
(if size > 1 {
size.to_string()
} else {
String::new()
}) + "["
+ current
+ &values.map(|x| "[".to_string() + x).collect::<String>()
}
// ND collection
else {
let size: usize = values.clone().count();
let subcollections = values.map(|x| get_with_sizes(x)).collect::<String>();
size.to_string() + "[" + &subcollections
}
}
#[macro_export]
macro_rules! to_bytes {
($($arg:tt)+) => {
{
// Simplify input string
let flat = format!("{:?}", $($arg)+)
.replace("false", "0")
.replace("true", "1")
.replace('(', "[")
.replace(')', "]")
.replace('{', "[")
.replace('}', "]");
let flat = tobytes::get_with_sizes(&flat);
flat
.replace('[', ",")
.replace(']', " ")
.replace(':', ",")
.split(',')
.map(|val| {
let val = val.trim();
if let Some(num) = val.parse::<u64>().ok() {
vec![num]
}
else {
let val = val.trim_matches('"');
let mut size = vec![val.len() as u64];
size.extend(val
.bytes()
.into_iter()
.map(|x| x as u64)
.collect::<Vec<u64>>());
size
}
})
.flatten()
.collect::<Vec<u64>>()
}
}
}
|