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 {
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)
}