fastrlp_derive/
lib.rs

1//! Derive macro for `#[derive(Encodable, Decodable)]`.
2//!
3//! For example of usage see `./tests/rlp.rs`.
4//!
5//! This library also supports up to 1 `#[rlp(default)]` in a struct,
6//! which is similar to [`#[serde(default)]`](https://serde.rs/field-attrs.html#default)
7//! with the caveat that we use the `Default` value if
8//! the field deserialization fails, as we don't serialize field
9//! names and there is no way to tell if it is present or not.
10
11#![no_std]
12
13extern crate alloc;
14extern crate proc_macro;
15
16mod de;
17mod en;
18
19use de::*;
20use en::*;
21use proc_macro::TokenStream;
22
23#[proc_macro_derive(Encodable, attributes(rlp))]
24pub fn encodable(input: TokenStream) -> TokenStream {
25    let ast = syn::parse(input).unwrap();
26    let gen = impl_encodable(&ast);
27    gen.into()
28}
29
30#[proc_macro_derive(EncodableWrapper, attributes(rlp))]
31pub fn encodable_wrapper(input: TokenStream) -> TokenStream {
32    let ast = syn::parse(input).unwrap();
33    let gen = impl_encodable_wrapper(&ast);
34    gen.into()
35}
36
37#[proc_macro_derive(MaxEncodedLen, attributes(rlp))]
38pub fn max_encoded_len(input: TokenStream) -> TokenStream {
39    let ast = syn::parse(input).unwrap();
40    let gen = impl_max_encoded_len(&ast);
41    gen.into()
42}
43
44#[proc_macro_derive(Decodable, attributes(rlp))]
45pub fn decodable(input: TokenStream) -> TokenStream {
46    let ast = syn::parse(input).unwrap();
47    let gen = impl_decodable(&ast);
48    gen.into()
49}
50
51#[proc_macro_derive(DecodableWrapper, attributes(rlp))]
52pub fn decodable_wrapper(input: TokenStream) -> TokenStream {
53    let ast = syn::parse(input).unwrap();
54    let gen = impl_decodable_wrapper(&ast);
55    gen.into()
56}