aboutsummaryrefslogtreecommitdiff
path: root/zkvms/zkwasm/wrapper_macro/src
diff options
context:
space:
mode:
authorKamen Mladenov <kamen@syndamia.com>2025-02-05 14:25:19 +0200
committerKamen Mladenov <kamen@syndamia.com>2025-02-05 14:25:19 +0200
commit5cbd68a39d7a91160fbb8ed81fe9aef5b7dc14b6 (patch)
tree2d4a5c2ed1dcd8d7ab13b0c7777fb5e58f79df9b /zkvms/zkwasm/wrapper_macro/src
parent6bb6c60b6d50bff99169b56bc68cb04f0c906525 (diff)
downloadzkVMs-benchmarks-5cbd68a39d7a91160fbb8ed81fe9aef5b7dc14b6.tar
zkVMs-benchmarks-5cbd68a39d7a91160fbb8ed81fe9aef5b7dc14b6.tar.gz
zkVMs-benchmarks-5cbd68a39d7a91160fbb8ed81fe9aef5b7dc14b6.zip
feat(zkvms/zkwasm): Support reading hashmaps
Diffstat (limited to 'zkvms/zkwasm/wrapper_macro/src')
-rw-r--r--zkvms/zkwasm/wrapper_macro/src/lib.rs24
1 files changed, 24 insertions, 0 deletions
diff --git a/zkvms/zkwasm/wrapper_macro/src/lib.rs b/zkvms/zkwasm/wrapper_macro/src/lib.rs
index acf56d1..f5cdfbb 100644
--- a/zkvms/zkwasm/wrapper_macro/src/lib.rs
+++ b/zkvms/zkwasm/wrapper_macro/src/lib.rs
@@ -28,6 +28,13 @@ fn insert_reads(out: &mut TokenStream, patterns: &Vec<TokenStream>, types: &Vec<
value = &array[0];
format!("{} [ {} ", typ, array.len())
}
+ // STD HashMap
+ else if typ.ends_with("HashMap") {
+ let array = value.as_table()
+ .expect("value is of type HashMap but isn't an array");
+ // value = &array[0];
+ format!("{} [ {} ", typ, array.len())
+ }
else {
typ.to_string()
})
@@ -120,6 +127,22 @@ fn return_vec(readfn: &TokenTree, size: &TokenTree, inner: &TokenStream) -> Toke
").parse().unwrap()
}
+fn return_hashmap(readfn: &TokenTree, size: &TokenTree, inner: &TokenStream) -> TokenStream {
+ let mut inner = inner.clone().into_iter();
+ let key_type = inner.next().unwrap();
+ inner.next().unwrap();
+ let value_type = inner.next().unwrap();
+ format!(r#"
+ {{
+ let mut ret = HashMap::new();
+ for _ in 0..{size} {{
+ ret.insert(read!({readfn} {key_type}), read!({readfn} {value_type}));
+ }}
+ ret
+ }}
+ "#).parse().unwrap()
+}
+
fn return_tuple(readfn: &TokenTree, inner: &TokenStream) -> TokenStream {
let mut value = String::new();
for subtype in inner.clone().into_iter() {
@@ -160,6 +183,7 @@ pub fn read(item: TokenStream) -> TokenStream {
match ident.to_string().as_str() {
"Vec" => return_vec(&readfn, &size, &rest),
+ "HashMap" => return_hashmap(&readfn, &size, &rest),
_ => todo!("Unsupported container {ident}"),
}
}