[Solved] Derive and proc_macro : Add field to an existing struct

Thank you very much @Cerber-Ursi :+1:
It make sense now !

For people interested by the working implementation :
[lib.rs]

use proc_macro::TokenStream;
use syn::{parse_macro_input, DeriveInput, parse::Parser};
use quote::quote;

#[proc_macro_attribute]
pub fn add_field(_args: TokenStream, input: TokenStream) -> TokenStream  {
    let mut ast = parse_macro_input!(input as DeriveInput);
    match &mut ast.data {
        syn::Data::Struct(ref mut struct_data) => {           
            match &mut struct_data.fields {
                syn::Fields::Named(fields) => {
                    fields
                        .named
                        .push(syn::Field::parse_named.parse2(quote! { pub a: String }).unwrap());
                }   
                _ => {
                    ()
                }
            }              
            
            return quote! {
                #ast
            }.into();
        }
        _ => panic!("`add_field` has to be used with structs "),
    }
}

[test.rs]

use proc_macro_issue_minimal_example::add_field;
#[add_field]
#[derive(Debug, Clone)]
struct Foo {}

let bar = Foo { a: "lorem ipsum".to_string()};
5 Likes