rustato_proc_macros/
lib.rs1use proc_macro::TokenStream;
2use quote::quote;
3use syn::{parse_macro_input, ItemStruct, LitStr};
4
5#[proc_macro]
6pub fn create_state(input: TokenStream) -> TokenStream {
7 let input = parse_macro_input!(input as ItemStruct);
8 let struct_name = &input.ident;
9 let struct_def = &input;
10
11 let expanded = quote! {
12 #[derive(Clone, Default)]
13 #struct_def
14
15 rustato::GLOBAL_STATE_MANAGER.register_state::<#struct_name>(stringify!(#struct_name), #struct_name::default());
16 };
17
18 TokenStream::from(expanded)
19}
20
21struct CreateStateInput {
22 id: LitStr,
23 struct_def: ItemStruct,
24}
25
26impl syn::parse::Parse for CreateStateInput {
27 fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
28 let id = input.parse()?;
29 input.parse::<syn::Token![,]>()?;
30 let struct_def = input.parse()?;
31 Ok(CreateStateInput { id, struct_def })
32 }
33}