use ssz2::{Decodable, DecodeError, Encodable, SszDecoderBuilder, SszStream}; pub struct Foo { a: u16, b: Vec, c: u16, } impl Encodable for Foo { fn is_ssz_fixed_len() -> bool { ::is_ssz_fixed_len() && as Encodable>::is_ssz_fixed_len() } fn as_ssz_bytes(&self) -> Vec { let mut stream = SszStream::new(); stream.append(&self.a); stream.append(&self.b); stream.append(&self.c); stream.drain() } } impl Decodable for Foo { fn is_ssz_fixed_len() -> bool { ::is_ssz_fixed_len() && as Decodable>::is_ssz_fixed_len() } fn from_ssz_bytes(bytes: &[u8]) -> Result { let mut builder = SszDecoderBuilder::new(bytes); builder.register_type::()?; builder.register_type::>()?; builder.register_type::()?; let mut decoder = builder.build()?; Ok(Self { a: decoder.decode_next()?, b: decoder.decode_next()?, c: decoder.decode_next()?, }) } } fn main() { let foo = Foo { a: 42, b: vec![0, 1, 2, 3], c: 11, }; assert_eq!( foo.as_ssz_bytes(), vec![42, 0, 8, 0, 0, 0, 11, 0, 0, 1, 2, 3] ); }