alloy_rlp_derive/
lib.rs

1#![doc = include_str!("../README.md")]
2#![doc(
3    html_logo_url = "https://raw.githubusercontent.com/alloy-rs/core/main/assets/alloy.jpg",
4    html_favicon_url = "https://raw.githubusercontent.com/alloy-rs/core/main/assets/favicon.ico"
5)]
6#![warn(missing_docs, unreachable_pub, rustdoc::all)]
7#![deny(unused_must_use, unused_crate_dependencies)]
8#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))]
9
10extern crate proc_macro;
11
12mod de;
13mod en;
14mod utils;
15
16use de::*;
17use en::*;
18use proc_macro::TokenStream;
19
20/// Derives `Encodable` for the type which encodes the all fields as list:
21/// `<rlp-header, fields...>`
22#[proc_macro_derive(RlpEncodable, attributes(rlp))]
23pub fn encodable(input: TokenStream) -> TokenStream {
24    syn::parse(input)
25        .and_then(|ast| impl_encodable(&ast))
26        .unwrap_or_else(|err| err.to_compile_error())
27        .into()
28}
29
30/// Derives `Encodable` for the `newtype` which encodes its single field as-is, without a header:
31/// `<field>`
32#[proc_macro_derive(RlpEncodableWrapper, attributes(rlp))]
33pub fn encodable_wrapper(input: TokenStream) -> TokenStream {
34    syn::parse(input)
35        .and_then(|ast| impl_encodable_wrapper(&ast))
36        .unwrap_or_else(|err| err.to_compile_error())
37        .into()
38}
39
40/// Derives `MaxEncodedLen` for types of constant size.
41#[proc_macro_derive(RlpMaxEncodedLen, attributes(rlp))]
42pub fn max_encoded_len(input: TokenStream) -> TokenStream {
43    syn::parse(input)
44        .and_then(|ast| impl_max_encoded_len(&ast))
45        .unwrap_or_else(|err| err.to_compile_error())
46        .into()
47}
48
49/// Derives `Decodable` for the type whose implementation expects an rlp-list
50/// input: `<rlp-header, fields...>`
51///
52/// This is the inverse of `RlpEncodable`.
53#[proc_macro_derive(RlpDecodable, attributes(rlp))]
54pub fn decodable(input: TokenStream) -> TokenStream {
55    syn::parse(input)
56        .and_then(|ast| impl_decodable(&ast))
57        .unwrap_or_else(|err| err.to_compile_error())
58        .into()
59}
60
61/// Derives `Decodable` for the type whose implementation expects only the
62/// individual fields encoded: `<fields...>`
63///
64/// This is the inverse of `RlpEncodableWrapper`.
65#[proc_macro_derive(RlpDecodableWrapper, attributes(rlp))]
66pub fn decodable_wrapper(input: TokenStream) -> TokenStream {
67    syn::parse(input)
68        .and_then(|ast| impl_decodable_wrapper(&ast))
69        .unwrap_or_else(|err| err.to_compile_error())
70        .into()
71}