aboutsummaryrefslogtreecommitdiff
path: root/zkvms/zkwasm/host/tobytes/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'zkvms/zkwasm/host/tobytes/src/lib.rs')
-rw-r--r--zkvms/zkwasm/host/tobytes/src/lib.rs79
1 files changed, 79 insertions, 0 deletions
diff --git a/zkvms/zkwasm/host/tobytes/src/lib.rs b/zkvms/zkwasm/host/tobytes/src/lib.rs
new file mode 100644
index 0000000..2761458
--- /dev/null
+++ b/zkvms/zkwasm/host/tobytes/src/lib.rs
@@ -0,0 +1,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>>()
+ }
+ }
+}