]> saetta.ns0.it Git - rust/zakform_macro/commitdiff
Added new struct and fields.
authorAndrea Zagli <azagli@libero.it>
Tue, 7 Jul 2026 08:01:29 +0000 (10:01 +0200)
committerAndrea Zagli <azagli@libero.it>
Tue, 7 Jul 2026 08:01:29 +0000 (10:01 +0200)
zakform_macro/src/lib.rs

index e3418665caa2fb2b3db9333b62139cc3e9bd867c..06ee672254019dd5533b94d5ecd1281ed0643ef2 100644 (file)
@@ -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)
 }