From a82b39d1001fb6cb8d6e1cc824028aa08c7ed6de Mon Sep 17 00:00:00 2001 From: Kamen Mladenov Date: Wed, 22 Jan 2025 11:53:08 +0200 Subject: feat(guests_macro): Implement args_divide_grouped Use it in multiple zkVMs, simplifying codebase --- guests_macro/src/parse_fn.rs | 15 +++++++++++---- zkvms/nexus/wrapper_macro/src/lib.rs | 6 ++---- zkvms/risc0/wrapper_macro/src/lib.rs | 5 ++--- zkvms/sp1/wrapper_macro/src/lib.rs | 5 ++--- zkvms/zkm/wrapper_macro/src/lib.rs | 6 ++---- 5 files changed, 19 insertions(+), 18 deletions(-) diff --git a/guests_macro/src/parse_fn.rs b/guests_macro/src/parse_fn.rs index 506b26a..0e5712b 100644 --- a/guests_macro/src/parse_fn.rs +++ b/guests_macro/src/parse_fn.rs @@ -45,7 +45,7 @@ pub fn split_fn(item: &TokenStream) -> (TokenStream, TokenStream, TokenStream) { } /// Input: "(p1 : t1, p2: t2, ...)" -/// Output: "p1 : t1", "p2: t2", ... +/// Output: vec!["p1 : t1", "p2: t2", ...] pub fn args_split(item: &TokenStream) -> Vec { let contents; if let TokenTree::Group(group) = item.clone().into_iter().next().unwrap() { @@ -78,8 +78,8 @@ pub fn args_split(item: &TokenStream) -> Vec { args } -/// Input: (p1 : t1, p2: t2, ...) -/// Output: (p1, p2, ...), (t1, t2, ...) +/// Input: "(p1 : t1, p2: t2, ...)" +/// Output: vec![p1, p2, ...], vec![t1, t2, ...] pub fn args_divide(item: &TokenStream) -> (Vec, Vec) { let contents; if let TokenTree::Group(group) = item.clone().into_iter().next().unwrap() { @@ -129,7 +129,14 @@ pub fn args_divide(item: &TokenStream) -> (Vec, Vec) { (patterns, types) } -/// Input: "p1 p2 ..." +/// Input: "(p1 : t1, p2: t2, ...)" +/// Output: "(p1, p2, ...)", "(t1, t2, ...)" +pub fn args_divide_grouped(item: &TokenStream) -> (TokenStream, TokenStream) { + let (patterns, types) = args_divide(&item); + (group_streams(&patterns), group_streams(&types)) +} + +/// Input: vec![p1, p2, ...] /// Output: "(p1, p2, ...)" pub fn group_streams(patterns: &Vec) -> TokenStream { let mut inner_ts = TokenStream::new(); diff --git a/zkvms/nexus/wrapper_macro/src/lib.rs b/zkvms/nexus/wrapper_macro/src/lib.rs index 21bf1bb..54ea2e9 100644 --- a/zkvms/nexus/wrapper_macro/src/lib.rs +++ b/zkvms/nexus/wrapper_macro/src/lib.rs @@ -2,15 +2,13 @@ use proc_macro::TokenStream; #[path = "../../../../guests_macro/src/parse_fn.rs"] mod parse_fn; -use crate::parse_fn::{ split_fn, args_split, args_divide, group_streams }; +use crate::parse_fn::{ split_fn, args_split, args_divide_grouped }; #[proc_macro] pub fn make_wrapper(item: TokenStream) -> TokenStream { let (name, args, ret) = split_fn(&item); - let (patterns, types) = args_divide(&args); - let ts_patterns = group_streams(&patterns); - let ts_types = group_streams(&types); + let (ts_patterns, ts_types) = args_divide_grouped(&args); let mut out = TokenStream::new(); out.extend(format!("let {} = read_private_input::<{}>().unwrap();", ts_patterns, ts_types).parse::()); diff --git a/zkvms/risc0/wrapper_macro/src/lib.rs b/zkvms/risc0/wrapper_macro/src/lib.rs index eb24c33..67aaad6 100644 --- a/zkvms/risc0/wrapper_macro/src/lib.rs +++ b/zkvms/risc0/wrapper_macro/src/lib.rs @@ -2,7 +2,7 @@ use proc_macro::TokenStream; #[path = "../../../../guests_macro/src/parse_fn.rs"] mod parse_fn; -use crate::parse_fn::{ split_fn, args_split, args_divide, group_streams }; +use crate::parse_fn::{ split_fn, args_split, args_divide_grouped }; #[proc_macro] pub fn make_wrapper(item: TokenStream) -> TokenStream { @@ -14,8 +14,7 @@ pub fn make_wrapper(item: TokenStream) -> TokenStream { out.extend(format!("let {} = read();", arg).parse::()); } - let (patterns, _) = args_divide(&args); - let ts_patterns = group_streams(&patterns); + let (ts_patterns, _) = args_divide_grouped(&args); out.extend(format!("commit(&zkp::{}{});", name, ts_patterns).parse::()); diff --git a/zkvms/sp1/wrapper_macro/src/lib.rs b/zkvms/sp1/wrapper_macro/src/lib.rs index eb24c33..67aaad6 100644 --- a/zkvms/sp1/wrapper_macro/src/lib.rs +++ b/zkvms/sp1/wrapper_macro/src/lib.rs @@ -2,7 +2,7 @@ use proc_macro::TokenStream; #[path = "../../../../guests_macro/src/parse_fn.rs"] mod parse_fn; -use crate::parse_fn::{ split_fn, args_split, args_divide, group_streams }; +use crate::parse_fn::{ split_fn, args_split, args_divide_grouped }; #[proc_macro] pub fn make_wrapper(item: TokenStream) -> TokenStream { @@ -14,8 +14,7 @@ pub fn make_wrapper(item: TokenStream) -> TokenStream { out.extend(format!("let {} = read();", arg).parse::()); } - let (patterns, _) = args_divide(&args); - let ts_patterns = group_streams(&patterns); + let (ts_patterns, _) = args_divide_grouped(&args); out.extend(format!("commit(&zkp::{}{});", name, ts_patterns).parse::()); diff --git a/zkvms/zkm/wrapper_macro/src/lib.rs b/zkvms/zkm/wrapper_macro/src/lib.rs index 86594e6..57b9d24 100644 --- a/zkvms/zkm/wrapper_macro/src/lib.rs +++ b/zkvms/zkm/wrapper_macro/src/lib.rs @@ -2,15 +2,13 @@ use proc_macro::TokenStream; #[path = "../../../../guests_macro/src/parse_fn.rs"] mod parse_fn; -use crate::parse_fn::{ split_fn, args_split, args_divide, group_streams }; +use crate::parse_fn::{ split_fn, args_split, args_divide_grouped }; #[proc_macro] pub fn make_wrapper(item: TokenStream) -> TokenStream { let (name, args, ret) = split_fn(&item); - let (patterns, types) = args_divide(&args); - let ts_patterns = group_streams(&patterns); - let ts_types = group_streams(&types); + let (ts_patterns, ts_types) = args_divide_grouped(&args); let mut out = TokenStream::new(); // NOTE: The first read returns public data, the second returns private -- cgit v1.2.3