tui_helper_proc_macro/
lib.rs

1#[macro_use]
2extern crate quote;
3#[macro_use]
4extern crate syn;
5
6extern crate proc_macro;
7
8use proc_macro::TokenStream;
9use syn::{DeriveInput, ItemFn};
10
11/// Turns a function into a set.
12/// Allows for simpler definitions of sets.
13#[proc_macro_attribute]
14pub fn set(_inner: TokenStream, input: TokenStream) -> TokenStream {
15    let input = parse_macro_input!(input as ItemFn);
16
17    let ident = input.sig.ident.clone();
18    let block = input.block.clone();
19    let vis = input.vis.clone();
20
21    let expanded = quote! {
22        #vis struct #ident;
23
24        impl Set for #ident {
25            fn register_set(&self, app: App) -> App {
26                (move |app: App| #block)(app)
27            }
28        }
29    };
30
31    TokenStream::from(expanded)
32}
33
34#[proc_macro_derive(State)]
35pub fn res(input: TokenStream) -> TokenStream {
36    let input = parse_macro_input!(input as DeriveInput);
37
38    let ident = input.ident.clone();
39
40    let expanded = quote! {
41        impl State for #ident {}
42    };
43
44    TokenStream::from(expanded)
45}