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