global_id_creator_macro/
lib.rs

1extern crate proc_macro;
2use proc_macro::TokenStream;
3use quote::quote;
4use syn::{parse_macro_input, Ident, Token};
5use syn::punctuated::Punctuated;
6use syn::parse::{Parse, ParseStream};
7
8/// Struct để parse input của macro
9struct ConstListInput {
10    enum_name: Ident,
11    const_names: Punctuated<Ident, Token![,]>,
12}
13
14impl Parse for ConstListInput {
15    fn parse(input: ParseStream) -> syn::Result<Self> {
16        let enum_name: Ident = input.parse()?;
17        let _comma: Token![,] = input.parse()?;
18        let const_names = Punctuated::parse_separated_nonempty(input)?;
19        Ok(ConstListInput {
20            enum_name,
21            const_names,
22        })
23    }
24}
25
26#[proc_macro]
27pub fn ntl_create_global_id(input: TokenStream) -> TokenStream {
28    // Parse input từ token stream
29    let ConstListInput {
30        enum_name,
31        const_names,
32    } = parse_macro_input!(input as ConstListInput);
33
34    // Khởi tạo giá trị ban đầu từ enum
35    let mut value = quote! { 100 }; // Giả sử bắt đầu từ 10, có thể điều chỉnh theo yêu cầu
36
37    // Tạo danh sách các hằng số với giá trị tăng dần dưới dạng enum Id(u8)
38    let consts = const_names.into_iter().map(|name| {
39        let const_def = quote! {
40            pub const #name: #enum_name = #enum_name::Id(#value);
41        };
42        value = quote! { #value + 1 };
43        const_def
44    });
45
46    // Trả các hằng số trực tiếp (không có khối {})
47    let expanded = quote! {
48        #(#consts)*
49    };
50
51    // Trả kết quả dưới dạng TokenStream
52    TokenStream::from(expanded)
53}