novax_data/types/
managed_vec.rs

1use multiversx_sc::api::ManagedTypeApi;
2use multiversx_sc::codec::{NestedEncode, TopEncodeMulti};
3use multiversx_sc::types::{ManagedVec, ManagedVecItem};
4use multiversx_sc_scenario::api::StaticApi;
5use crate::types::managed::ManagedConvertible;
6use crate::types::native::NativeConvertible;
7
8impl<M: ManagedTypeApi, T: NativeConvertible + ManagedVecItem> NativeConvertible for ManagedVec<M, T> {
9    type Native = Vec<T::Native>;
10
11    fn to_native(&self) -> Self::Native {
12        self.into_iter().map(|e| e.to_native()).collect()
13    }
14}
15
16impl<C, T> ManagedConvertible<ManagedVec<StaticApi, T>> for Vec<C>
17where
18    C: ManagedConvertible<T>,
19    T: TopEncodeMulti + NestedEncode + ManagedVecItem
20{
21    fn to_managed(&self) -> ManagedVec<StaticApi, T> {
22        let mut result = ManagedVec::new();
23        for convertible_value in self {
24            result.push(convertible_value.to_managed());
25        }
26        result
27    }
28}
29
30#[cfg(test)]
31mod tests {
32    use multiversx_sc::types::{ManagedBuffer, ManagedVec};
33    use multiversx_sc_scenario::api::StaticApi;
34    use crate::types::managed::ManagedConvertible;
35    use crate::types::native::NativeConvertible;
36
37    #[test]
38    fn test_managed_vec_to_native() {
39        let mut managed_vec: ManagedVec<StaticApi, ManagedBuffer<StaticApi>> = ManagedVec::new();
40
41        managed_vec.push(ManagedBuffer::from("first"));
42        managed_vec.push(ManagedBuffer::from("second"));
43        managed_vec.push(ManagedBuffer::from("third"));
44
45        let native = managed_vec.to_native();
46        let expected = vec![
47            String::from("first"),
48            String::from("second"),
49            String::from("third")
50        ];
51
52        assert_eq!(
53            native,
54            expected
55        )
56    }
57
58    #[test]
59    fn test_vec_to_managed() {
60        let vec = vec![
61            "first".to_string(),
62            "second".to_string(),
63            "third".to_string()
64        ];
65
66
67        let mut expected_managed_vec: ManagedVec<StaticApi, ManagedBuffer<StaticApi>> = ManagedVec::new();
68
69        expected_managed_vec.push(ManagedBuffer::from("first"));
70        expected_managed_vec.push(ManagedBuffer::from("second"));
71        expected_managed_vec.push(ManagedBuffer::from("third"));
72
73        let result: ManagedVec<StaticApi, ManagedBuffer<StaticApi>> = vec.to_managed();
74
75        assert_eq!(
76            result,
77            expected_managed_vec
78        )
79    }
80}