sqlstate_macros/
lib.rs

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}