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;
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