macro_withstate/
lib.rs

1extern crate proc_macro;
2extern crate quote;
3extern crate syn;
4
5use proc_macro::TokenStream;
6use quote::quote;
7use syn::{parse_macro_input, ItemStruct, TypePath};
8
9
10/// Use attribute while `derive(WithState<State>)` is unavailable.
11#[proc_macro_attribute]
12pub fn with_state(attr: TokenStream, item: TokenStream) -> TokenStream {
13    let attr_input = parse_macro_input!(attr as TypePath);
14    let item_input = parse_macro_input!(item as ItemStruct);
15    let state = attr_input;
16    let node = item_input.ident.clone();
17
18    let expand = quote! {
19        #item_input
20        impl WithState<#state> for #node {}
21    };
22    TokenStream::from(expand)
23}