Thank you very much @Cerber-Ursi
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()};