rustato_proc_macros/
lib.rs

1use 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}