diff options
| author | Kamen Mladenov <kamen@syndamia.com> | 2025-02-05 14:25:19 +0200 |
|---|---|---|
| committer | Kamen Mladenov <kamen@syndamia.com> | 2025-02-05 14:25:19 +0200 |
| commit | 5cbd68a39d7a91160fbb8ed81fe9aef5b7dc14b6 (patch) | |
| tree | 2d4a5c2ed1dcd8d7ab13b0c7777fb5e58f79df9b | |
| parent | 6bb6c60b6d50bff99169b56bc68cb04f0c906525 (diff) | |
| download | zkVMs-benchmarks-5cbd68a39d7a91160fbb8ed81fe9aef5b7dc14b6.tar zkVMs-benchmarks-5cbd68a39d7a91160fbb8ed81fe9aef5b7dc14b6.tar.gz zkVMs-benchmarks-5cbd68a39d7a91160fbb8ed81fe9aef5b7dc14b6.zip | |
feat(zkvms/zkwasm): Support reading hashmaps
| -rw-r--r-- | zkvms/zkwasm/wrapper_macro/src/lib.rs | 24 |
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}"), } } |
