Skip to main content

ssz_derive/
lib.rs

1//! Derive macros for SSZ `Encode`, `Decode`, and `HashTreeRoot` traits.
2//!
3//! # Struct example
4//! ```ignore
5//! #[derive(Encode, Decode, HashTreeRoot)]
6//! struct MyStruct {
7//!     fixed_field: u32,
8//!     var_field: ssz::List<u8, 1024>,
9//!     #[ssz(skip)]
10//!     cached: u64,
11//! }
12//! ```
13//!
14//! # Newtype passthrough
15//! ```ignore
16//! #[derive(Encode, Decode, HashTreeRoot)]
17//! struct SlotIdx(#[ssz(transparent)] NonZeroU32);
18//! ```
19//!
20//! # Enum example (SSZ Union)
21//! ```ignore
22//! #[derive(Encode, Decode, HashTreeRoot)]
23//! enum Cap {
24//!     #[ssz(selector = 0)]
25//!     Instance(InstanceCap),
26//!     #[ssz(selector = 1)]
27//!     Image(ImageCap),
28//! }
29//! ```
30
31use proc_macro::TokenStream;
32use syn::{DeriveInput, parse_macro_input};
33
34mod container;
35mod decode;
36mod encode;
37mod hash_tree_root;
38mod parse;
39
40/// Derive the `ssz::Encode` trait for a struct or enum.
41#[proc_macro_derive(Encode, attributes(ssz))]
42pub fn derive_encode(input: TokenStream) -> TokenStream {
43    let input = parse_macro_input!(input as DeriveInput);
44    encode::derive_encode_impl(&input)
45        .unwrap_or_else(|e| e.to_compile_error())
46        .into()
47}
48
49/// Derive the `ssz::Decode` trait for a struct or enum.
50#[proc_macro_derive(Decode, attributes(ssz))]
51pub fn derive_decode(input: TokenStream) -> TokenStream {
52    let input = parse_macro_input!(input as DeriveInput);
53    decode::derive_decode_impl(&input)
54        .unwrap_or_else(|e| e.to_compile_error())
55        .into()
56}
57
58/// Derive the `ssz::HashTreeRoot` trait for a struct or enum.
59#[proc_macro_derive(HashTreeRoot, attributes(ssz))]
60pub fn derive_hash_tree_root(input: TokenStream) -> TokenStream {
61    let input = parse_macro_input!(input as DeriveInput);
62    hash_tree_root::derive_hash_tree_root_impl(&input)
63        .unwrap_or_else(|e| e.to_compile_error())
64        .into()
65}