To write a procedural macro, create a new library crate with the proc-macro crate type and implement the proc_macro::TokenStream conversion logic.
[lib]
proc-macro = true
[dependencies]
proc-macro2 = "1.0"
quote = "1.0"
syn = "2.0"
use proc_macro::TokenStream;
use quote::quote;
use syn;
#[proc_macro_derive(MyDerive)]
pub fn my_derive(input: TokenStream) -> TokenStream {
let ast: syn::DeriveInput = syn::parse(input).unwrap();
let name = &ast.ident;
let expanded = quote! {
impl MyTrait for #name {
fn my_method(&self) {
println!("Hello from {}", stringify!(#name));
}
}
};
TokenStream::from(expanded)
}
use my_proc_macro::MyDerive;
#[derive(MyDerive)]
struct MyStruct;
fn main() {
let s = MyStruct;
s.my_method();
}