How to write procedural macro

Write a procedural macro by creating a library crate with `proc-macro = true` and implementing the `TokenStream` conversion logic to generate code at compile time.

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();
}