1use proc_macro::TokenStream;
3use quote::quote;
4use syn::{parse_macro_input, Data, DeriveInput, Fields};
5
6#[proc_macro]
10pub fn init(_input: TokenStream) -> TokenStream {
11 quote! {
12 #[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)]
13 pub struct ID(usize);
14 pub trait Entity {
15 fn id(&self) -> ID;
16 }
17 }
18 .into()
19}
20
21#[proc_macro_derive(EntityBase)]
27pub fn entity_derive(input: TokenStream) -> TokenStream {
28 let input = parse_macro_input!(input as DeriveInput);
30
31 let struct_name = &input.ident;
33 let _fields = match input.data {
34 Data::Struct(ref data) => match data.fields {
35 Fields::Unnamed(ref fields) => &fields.unnamed,
36 _ => panic!("实体必须为未名结构体"),
37 },
38 _ => panic!("实体必须为结构体"),
39 };
40
41 let expanded = quote! {
43 impl Entity for #struct_name{
44 fn id(&self) -> ID{
45 self.0
46 }
47 }
48 };
49
50 TokenStream::from(expanded)
52}