proc_macro_protocol/
protocol.rs1extern crate proc_macro;
2
3use proc_macro::TokenStream;
4use quote::quote;
5use std::{
6 collections::hash_map::DefaultHasher,
7 hash::{Hash, Hasher},
8};
9use syn::{parse_macro_input, DeriveInput};
10
11#[proc_macro_derive(Protocol)]
12pub fn derive_payload_fn(item: TokenStream) -> TokenStream {
13 let DeriveInput { ident, .. } = parse_macro_input!(item);
14 let mut s = DefaultHasher::new();
15 ident.to_string().hash(&mut s);
16 let id = s.finish() as u16;
17 let reflect_name = ident.to_string();
18 quote! {
19 impl bevy_rtc::protocol::Protocol for #ident {
20 fn id() -> u16 {
21 #id
22 }
23 fn reflect_name() -> &'static str {
24 #reflect_name
25 }
26 }
27 }
28 .into()
29}