novax_data/types/
tuples.rs

1use crate::types::native::NativeConvertible;
2use crate::types::managed::ManagedConvertible;
3use multiversx_sc_codec::TopEncode;
4use multiversx_sc_codec::NestedEncode;
5
6macro_rules! tuple_impl {
7    ($(($($num:tt $type_name:ident $native:ident)+) )+) => {
8        $(
9            impl<$($type_name, )+> NativeConvertible for ($($type_name, )+)
10            where
11                $($type_name: NativeConvertible, )+
12            {
13                type Native = ($($type_name::Native, )+);
14
15                fn to_native(&self) -> Self::Native {
16                    ($(self.$num.to_native(), )+)
17                }
18            }
19
20            impl<$($type_name, $native,)+> ManagedConvertible<($($type_name,)+)> for ($($native,)+)
21            where
22                $($type_name: TopEncode + NestedEncode + NativeConvertible<Native = $native>,)+
23                $($native: ManagedConvertible<$type_name>,)+
24            {
25                fn to_managed(&self) -> ($($type_name,)+) {
26                   ($(self.$num.to_managed()),+,)
27                }
28            }
29        )+
30    }
31}
32
33tuple_impl! {
34    (0 T0 N0)
35    (0 T0 N0 1 T1 N1)
36    (0 T0 N0 1 T1 N1 2 T2 N2)
37    (0 T0 N0 1 T1 N1 2 T2 N2 3 T3 N3)
38    (0 T0 N0 1 T1 N1 2 T2 N2 3 T3 N3 4 T4 N4)
39    (0 T0 N0 1 T1 N1 2 T2 N2 3 T3 N3 4 T4 N4 5 T5 N5)
40    (0 T0 N0 1 T1 N1 2 T2 N2 3 T3 N3 4 T4 N4 5 T5 N5 6 T6 N6)
41    (0 T0 N0 1 T1 N1 2 T2 N2 3 T3 N3 4 T4 N4 5 T5 N5 6 T6 N6 7 T7 N7)
42    (0 T0 N0 1 T1 N1 2 T2 N2 3 T3 N3 4 T4 N4 5 T5 N5 6 T6 N6 7 T7 N7 8 T8 N8)
43    (0 T0 N0 1 T1 N1 2 T2 N2 3 T3 N3 4 T4 N4 5 T5 N5 6 T6 N6 7 T7 N7 8 T8 N8 9 T9 N9)
44    (0 T0 N0 1 T1 N1 2 T2 N2 3 T3 N3 4 T4 N4 5 T5 N5 6 T6 N6 7 T7 N7 8 T8 N8 9 T9 N9 10 T10 N10)
45}
46
47#[cfg(test)]
48mod tests {
49    use multiversx_sc::types::ManagedBuffer;
50    use multiversx_sc_codec::multi_types::{MultiValue2, MultiValue7};
51    use multiversx_sc_scenario::api::StaticApi;
52    use crate::types::managed::ManagedConvertible;
53
54    type MultiBufferValue7 = MultiValue7<
55        ManagedBuffer<StaticApi>,
56        ManagedBuffer<StaticApi>,
57        ManagedBuffer<StaticApi>,
58        ManagedBuffer<StaticApi>,
59        ManagedBuffer<StaticApi>,
60        ManagedBuffer<StaticApi>,
61        ManagedBuffer<StaticApi>
62    >;
63
64    #[test]
65    fn tuple_2_to_managed() {
66        let tuple = (
67            "first".to_string(),
68            "second".to_string()
69        );
70        let managed: MultiValue2<ManagedBuffer<StaticApi>, ManagedBuffer<StaticApi>> = tuple.to_managed();
71
72        let expected_first_buffer: ManagedBuffer<StaticApi> = ManagedBuffer::from("first");
73        let expected_second_buffer: ManagedBuffer<StaticApi> = ManagedBuffer::from("second");
74        let expected = MultiValue2::from(
75            (expected_first_buffer, expected_second_buffer)
76        );
77
78        assert_eq!(
79            managed,
80            expected
81        );
82    }
83
84    #[test]
85    fn tuple_7_to_managed() {
86        let tuple = (
87            "first".to_string(),
88            "second".to_string(),
89            "third".to_string(),
90            "fourth".to_string(),
91            "fifth".to_string(),
92            "sixth".to_string(),
93            "seventh".to_string(),
94        );
95        let managed: MultiBufferValue7  = tuple.to_managed();
96
97        let expected_first_buffer: ManagedBuffer<StaticApi> = ManagedBuffer::from("first");
98        let expected_second_buffer: ManagedBuffer<StaticApi> = ManagedBuffer::from("second");
99        let expected_third_buffer: ManagedBuffer<StaticApi> = ManagedBuffer::from("third");
100        let expected_fourth_buffer: ManagedBuffer<StaticApi> = ManagedBuffer::from("fourth");
101        let expected_fifth_buffer: ManagedBuffer<StaticApi> = ManagedBuffer::from("fifth");
102        let expected_sixth_buffer: ManagedBuffer<StaticApi> = ManagedBuffer::from("sixth");
103        let expected_seventh_buffer: ManagedBuffer<StaticApi> = ManagedBuffer::from("seventh");
104        let expected = MultiValue7::from(
105            (
106                expected_first_buffer,
107                expected_second_buffer,
108                expected_third_buffer,
109                expected_fourth_buffer,
110                expected_fifth_buffer,
111                expected_sixth_buffer,
112                expected_seventh_buffer
113            )
114        );
115
116        assert_eq!(
117            managed,
118            expected
119        );
120    }
121}