global_id_creator_macro/
lib.rs1extern 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
8struct 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 let ConstListInput {
30 enum_name,
31 const_names,
32 } = parse_macro_input!(input as ConstListInput);
33
34 let mut value = quote! { 100 }; 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 let expanded = quote! {
48 #(#consts)*
49 };
50
51 TokenStream::from(expanded)
53}