From b03a7fc7466878905eecb3b90a596410eab2c726 Mon Sep 17 00:00:00 2001 From: Andrea Zagli Date: Tue, 7 Jul 2026 10:01:29 +0200 Subject: [PATCH] Added new struct and fields. --- zakform_macro/src/lib.rs | 43 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/zakform_macro/src/lib.rs b/zakform_macro/src/lib.rs index e341866..06ee672 100644 --- a/zakform_macro/src/lib.rs +++ b/zakform_macro/src/lib.rs @@ -2,7 +2,7 @@ extern crate proc_macro; use proc_macro::TokenStream; use syn::{parse_macro_input, DeriveInput}; -use quote::quote; +use quote::{quote, format_ident}; #[proc_macro_derive(IntoStringHashMap)] pub fn derive_into_hash_map(input: TokenStream) -> TokenStream { @@ -10,8 +10,43 @@ pub fn derive_into_hash_map(input: TokenStream) -> TokenStream { eprintln!("{ast:#?}"); let ident = ast.ident; - //todo!() - println!("HELLO FROM MACRO"); + let form_ident = format_ident!("{ident}Form"); - proc_macro::TokenStream::from(quote!{}) + let fields = match ast { + syn::DeriveInput{ + data: syn::Data::Struct( + syn::DataStruct{ + fields: syn::Fields::Named ( + syn::FieldsNamed{ + named: fields, + .. + }, + ), + .. + }, + ), + .. + } => { + fields + }, + _ => unimplemented!("derive(IntoStringHashMap) only supports structs with named fields") + }; + + let form_fields = fields.iter().map(|field| { + let field = field.clone(); + let id = field.ident.unwrap(); + let ty = field.ty; + + quote! { + #id: String, + } + }); + + let output = quote!{ + pub struct #form_ident { + #(#form_fields)* + } + }; + + proc_macro::TokenStream::from(output) } -- 2.53.0