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#[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}