Skip to main content

entropy_macro/
lib.rs

1// 在单独的模块中定义全局结构体和 trait
2use proc_macro::TokenStream;
3use quote::quote;
4use syn::{parse_macro_input, Data, DeriveInput, Fields};
5
6/*
7初始化参数
8*/
9#[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/*
22实现特性Entity的默认派生
23使用方法:
24  #[derive(Entity)]
25*/
26#[proc_macro_derive(EntityBase)]
27pub fn entity_derive(input: TokenStream) -> TokenStream {
28    // 解析输入的 Rust 代码
29    let input = parse_macro_input!(input as DeriveInput);
30
31    // 提取结构体的名称和字段内容
32    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    // 生成派生的定义
42    let expanded = quote! {
43        impl Entity for #struct_name{
44            fn id(&self) -> ID{
45                self.0
46            }
47        }
48    };
49
50    // 将生成的代码转换为TokenStream并返回
51    TokenStream::from(expanded)
52}