2019-05-05 22:47:49 +00:00
|
|
|
use ssz::{encode_length, Decodable, DecodeError, Encodable, SszDecoderBuilder, SszStream};
|
2019-05-03 07:39:51 +00:00
|
|
|
|
2019-05-03 07:50:29 +00:00
|
|
|
#[derive(Debug, PartialEq)]
|
2019-05-03 07:39:51 +00:00
|
|
|
pub struct Foo {
|
|
|
|
a: u16,
|
|
|
|
b: Vec<u8>,
|
|
|
|
c: u16,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Encodable for Foo {
|
|
|
|
fn is_ssz_fixed_len() -> bool {
|
|
|
|
<u16 as Encodable>::is_ssz_fixed_len() && <Vec<u16> as Encodable>::is_ssz_fixed_len()
|
|
|
|
}
|
|
|
|
|
2019-05-05 22:47:49 +00:00
|
|
|
fn ssz_append(&self, buf: &mut Vec<u8>) {
|
|
|
|
let offset = <u16 as Encodable>::ssz_fixed_len()
|
|
|
|
+ <Vec<u16> as Encodable>::ssz_fixed_len()
|
|
|
|
+ <u16 as Encodable>::ssz_fixed_len();
|
2019-05-03 07:39:51 +00:00
|
|
|
|
2019-05-05 22:47:49 +00:00
|
|
|
let mut fixed = Vec::with_capacity(offset);
|
|
|
|
let mut variable = vec![];
|
2019-05-03 07:39:51 +00:00
|
|
|
|
2019-05-05 22:47:49 +00:00
|
|
|
if <u16 as Encodable>::is_ssz_fixed_len() {
|
|
|
|
self.a.ssz_append(&mut fixed);
|
|
|
|
} else {
|
|
|
|
fixed.append(encode_length())
|
|
|
|
}
|
|
|
|
|
|
|
|
if <Vec<u16> as Encodable>::is_ssz_fixed_len() {
|
|
|
|
self.a.ssz_append(&mut fixed);
|
|
|
|
}
|
2019-05-03 07:39:51 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Decodable for Foo {
|
|
|
|
fn is_ssz_fixed_len() -> bool {
|
|
|
|
<u16 as Decodable>::is_ssz_fixed_len() && <Vec<u16> as Decodable>::is_ssz_fixed_len()
|
|
|
|
}
|
|
|
|
|
|
|
|
fn from_ssz_bytes(bytes: &[u8]) -> Result<Self, DecodeError> {
|
|
|
|
let mut builder = SszDecoderBuilder::new(bytes);
|
|
|
|
|
|
|
|
builder.register_type::<u16>()?;
|
|
|
|
builder.register_type::<Vec<u8>>()?;
|
|
|
|
builder.register_type::<u16>()?;
|
|
|
|
|
|
|
|
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,
|
|
|
|
};
|
|
|
|
|
2019-05-03 07:50:29 +00:00
|
|
|
let bytes = vec![42, 0, 8, 0, 0, 0, 11, 0, 0, 1, 2, 3];
|
|
|
|
|
|
|
|
assert_eq!(foo.as_ssz_bytes(), bytes);
|
|
|
|
|
|
|
|
let decoded_foo = Foo::from_ssz_bytes(&bytes).unwrap();
|
|
|
|
|
|
|
|
assert_eq!(foo, decoded_foo);
|
2019-05-03 07:39:51 +00:00
|
|
|
}
|