dharitri_sc_codec/multi_types/
multi_value_vec.rs

1use crate::{
2    DecodeErrorHandler, EncodeErrorHandler, TopDecodeMulti, TopDecodeMultiInput, TopEncodeMulti,
3    TopEncodeMultiOutput,
4};
5use alloc::vec::Vec;
6use core::iter::FromIterator;
7
8/// Structure that allows taking a variable number of arguments
9/// or returning a variable number of results in a smart contract endpoint.
10#[derive(Clone, Default, Debug, PartialEq, Eq)]
11pub struct MultiValueVec<T>(pub Vec<T>);
12
13impl<T> From<Vec<T>> for MultiValueVec<T> {
14    fn from(v: Vec<T>) -> Self {
15        MultiValueVec(v)
16    }
17}
18
19impl<T, const N: usize> From<[T; N]> for MultiValueVec<T>
20where
21    T: Clone,
22{
23    fn from(arr: [T; N]) -> Self {
24        MultiValueVec(arr[..].to_vec())
25    }
26}
27
28impl<T> MultiValueVec<T> {
29    #[inline]
30    pub fn new() -> Self {
31        MultiValueVec(Vec::new())
32    }
33}
34
35impl<T> MultiValueVec<T> {
36    #[inline]
37    pub fn into_vec(self) -> Vec<T> {
38        self.0
39    }
40
41    #[inline]
42    pub fn as_slice(&self) -> &[T] {
43        self.0.as_slice()
44    }
45
46    #[inline]
47    pub fn push(&mut self, value: T) {
48        self.0.push(value);
49    }
50
51    #[inline]
52    pub fn len(&self) -> usize {
53        self.0.len()
54    }
55
56    #[inline]
57    pub fn is_empty(&self) -> bool {
58        self.0.is_empty()
59    }
60
61    #[inline]
62    pub fn iter(&self) -> core::slice::Iter<'_, T> {
63        self.0.iter()
64    }
65}
66
67impl<T> FromIterator<T> for MultiValueVec<T> {
68    fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
69        let v = Vec::<T>::from_iter(iter);
70        MultiValueVec(v)
71    }
72}
73
74impl<T> TopEncodeMulti for MultiValueVec<T>
75where
76    T: TopEncodeMulti,
77{
78    fn multi_encode_or_handle_err<O, H>(&self, output: &mut O, h: H) -> Result<(), H::HandledErr>
79    where
80        O: TopEncodeMultiOutput,
81        H: EncodeErrorHandler,
82    {
83        for elem in self.0.iter() {
84            elem.multi_encode_or_handle_err(output, h)?;
85        }
86        Ok(())
87    }
88}
89
90impl<T> TopDecodeMulti for MultiValueVec<T>
91where
92    T: TopDecodeMulti,
93{
94    fn multi_decode_or_handle_err<I, H>(input: &mut I, h: H) -> Result<Self, H::HandledErr>
95    where
96        I: TopDecodeMultiInput,
97        H: DecodeErrorHandler,
98    {
99        let mut result_vec: Vec<T> = Vec::new();
100        while input.has_next() {
101            result_vec.push(T::multi_decode_or_handle_err(input, h)?);
102        }
103        Ok(Self(result_vec))
104    }
105}