1use proc_macro::TokenStream;
2use quote::{quote, ToTokens};
3use syn::{AttributeArgs, ItemEnum};
4
5mod class;
6mod state;
7
8use crate::state::State;
9
10use self::class::Class;
11
12fn is_standard(args: AttributeArgs) -> bool {
13 if args.len() != 1 {
14 panic!("type must be provided (standard/non_standard)");
15 }
16
17 match args[0].to_token_stream().to_string().as_str() {
18 "standard" => true,
19 "non_standard" => false,
20 other => panic!("invalid argument '{}'", other),
21 }
22}
23
24#[proc_macro_attribute]
25pub fn class(attr_args: TokenStream, item: TokenStream) -> TokenStream {
26 let class_enum = syn::parse_macro_input!(item as ItemEnum);
27 let args = syn::parse_macro_input!(attr_args as AttributeArgs);
28
29 let class = Class::new(class_enum, is_standard(args));
30 quote!(#class).into()
31}
32
33#[proc_macro_attribute]
34pub fn state(attr_args: TokenStream, item: TokenStream) -> TokenStream {
35 let state_enum = syn::parse_macro_input!(item as syn::ItemEnum);
36 let args = syn::parse_macro_input!(attr_args as AttributeArgs);
37
38 let state = State::new(state_enum, is_standard(args));
39 quote!(#state).into()
40}