solid_core/
decode.rs

1use crate::encode::Encode;
2
3/// Declares a type to be decodable from as Solidity response buffer
4pub trait Decode<'a>: Sized {
5    fn decode(buf: &'a [u8]) -> Self;
6}
7
8impl<'a, T: Decode<'a> + Encode> Decode<'a> for Vec<T> {
9    fn decode(buf: &'a [u8]) -> Self {
10        let len = u64::decode(&buf[0..32]) as usize;
11
12        let mut vec: Vec<T> = Vec::with_capacity(len);
13        for index in 0..len {
14            if T::is_dynamic() {
15                vec.push(T::decode(&buf[32 + index * 32..32 + (index + 1) * 32]))
16            } else {
17                let offset = u64::decode(&buf[32 + index * 32..32 + (index + 1) * 32]) as usize;
18                vec.push(T::decode(&buf[offset..]))
19            }
20        }
21        vec
22    }
23}