From: Andrea Zagli Date: Tue, 7 Jul 2026 08:01:29 +0000 (+0200) Subject: Added new struct and fields. X-Git-Url: https://saetta.ns0.it/gitweb?a=commitdiff_plain;h=b03a7fc7466878905eecb3b90a596410eab2c726;p=rust%2Fzakform_macro Added new struct and fields. --- 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) }