clockwork_macros/
lib.rs

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}