solid_derive/
lib.rs

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}