novax_data/types/
tuples.rs1use 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}