1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
extern crate proc_macro2; extern crate syn; #[macro_use] extern crate quote; #[cfg(not(feature = "nightly"))] extern crate proc_macro; use proc_macro::TokenStream; use proc_macro2::Literal; use syn::{ parse::{ Parse, ParseStream, }, parse_macro_input, DeriveInput, Ident, Result, Token, }; mod decode; mod encode; #[derive(Debug)] pub(crate) struct Solidity { ident: Ident, name: Option<Literal>, } impl Parse for Solidity { fn parse(input: ParseStream) -> Result<Self> { let ident: Ident = input.parse()?; let name = if let Ok(_) = input.parse::<Token![=]>() { Some(input.parse::<Literal>()?) } else { None }; Ok(Self { ident, name }) } } #[proc_macro_derive(Encode, attributes(solid))] pub fn encode(input: TokenStream) -> TokenStream { let ast = parse_macro_input!(input as DeriveInput); TokenStream::from(encode::impl_encode(&ast)) } #[proc_macro_derive(Decode, attributes(solid))] pub fn decode(input: TokenStream) -> TokenStream { let mut ast = parse_macro_input!(input as DeriveInput); TokenStream::from(decode::impl_decode(&mut ast)) }