proc_macro_protocol/
protocol.rs

1extern 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}