rgz_derive/
lib.rs

1use proc_macro::TokenStream;
2use quote::quote;
3use syn;
4use regex::Regex;
5
6#[proc_macro_derive(GzMessage)]
7pub fn gz_message_macro_derive(input: TokenStream) -> TokenStream {
8    let ast = syn::parse(input).unwrap();
9
10
11    impl_gz_message_macro(&ast)
12}
13
14fn impl_gz_message_macro(ast: &syn::DeriveInput) -> TokenStream {
15
16    // let name = &ast.ident;
17    let name = &ast.ident;
18    let name_str = name.to_string();
19    let re = Regex::new(r"(V)$").unwrap();
20    let replace_name = re.replace(&name_str,"_V").to_string();
21    let type_name = format!("gz.msgs.{}", replace_name);
22
23    let gen = quote! {
24        impl crate::GzMessage for #name {
25            const TYPE_NAME: &'static str = #type_name;
26        }
27    };
28    gen.into()
29}
30