aboutsummaryrefslogtreecommitdiff
path: root/zkvms_host_io/input_macros/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'zkvms_host_io/input_macros/src/lib.rs')
-rw-r--r--zkvms_host_io/input_macros/src/lib.rs36
1 files changed, 36 insertions, 0 deletions
diff --git a/zkvms_host_io/input_macros/src/lib.rs b/zkvms_host_io/input_macros/src/lib.rs
new file mode 100644
index 0000000..51fd613
--- /dev/null
+++ b/zkvms_host_io/input_macros/src/lib.rs
@@ -0,0 +1,36 @@
+use proc_macro::TokenStream;
+
+#[path = "../../../guests_macro/src/parse_fn.rs"]
+mod parse_fn;
+use crate::parse_fn::{ args_split, args_divide, group_streams };
+
+
+fn get_args() -> TokenStream {
+ "(graph: Vec<Vec<bool>>, colors: u32, coloring: Vec<Vec<u32>>,)".parse::<TokenStream>().unwrap()
+}
+
+#[proc_macro]
+pub fn generate_input_struct(_: TokenStream) -> TokenStream {
+ let args = &get_args();
+ let all_args = args_split(&args);
+
+ let mut struct_def = "#[derive(Debug, Serialize, Deserialize)] pub struct Input {".to_string();
+ for arg in all_args {
+ struct_def += &format!("pub {arg},");
+ }
+
+ let (patterns, types) = args_divide(&args);
+ let types = group_streams(&types);
+ struct_def += &format!("}}
+ impl From<Input> for {types} {{
+ fn from(input: Input) -> {types} {{
+ (
+ ");
+
+ for field in patterns {
+ struct_def += &format!("input.{field},");
+ }
+ struct_def += ") } }";
+
+ struct_def.parse::<TokenStream>().unwrap()
+}