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