1extern crate proc_macro;
2
3use proc_macro::TokenStream;
4use quote::quote;
5use syn::parse_macro_input;
6
7#[proc_macro_derive(TryFromData)]
8pub fn derive_try_from_data_attr(input: TokenStream) -> TokenStream {
9 let account_struct = parse_macro_input!(input as syn::ItemStruct);
10 let account_name = &account_struct.ident;
11 let (impl_gen, ty_gen, where_clause) = account_struct.generics.split_for_impl();
12 proc_macro::TokenStream::from(quote! {
13 #[automatically_derived]
14 impl #impl_gen TryFrom<Vec<u8>> for #account_name #ty_gen #where_clause {
15 type Error = Error;
16 fn try_from(data: Vec<u8>) -> std::result::Result<Self, Self::Error> {
17 #account_name::try_deserialize(&mut data.as_slice())
18 }
19 }
20 })
21}