numbat_wasm/io/
arg_serialize.rs

1use crate::hex_call_data::*;
2use crate::*;
3use numbat_codec::*;
4
5pub trait AsyncCallArg: Sized {
6	fn push_async_arg(&self, serializer: &mut HexCallDataSerializer) -> Result<(), SCError>;
7
8	fn push_async_arg_exact(
9		&self,
10		_serializer: &mut HexCallDataSerializer,
11		_expected_len: usize,
12	) -> Result<(), SCError> {
13		Err(SCError::from(&b"not supported"[..]))
14	}
15}
16
17struct AsyncCallArgOutput<'c> {
18	call_data_ser_ref: &'c mut HexCallDataSerializer,
19}
20
21impl<'c> AsyncCallArgOutput<'c> {
22	#[inline]
23	fn new(call_data_ser_ref: &'c mut HexCallDataSerializer) -> Self {
24		AsyncCallArgOutput { call_data_ser_ref }
25	}
26}
27
28impl<'c> TopEncodeOutput for AsyncCallArgOutput<'c> {
29	fn set_slice_u8(self, bytes: &[u8]) {
30		self.call_data_ser_ref.push_argument_bytes(bytes);
31	}
32}
33
34impl<T> AsyncCallArg for T
35where
36	T: TopEncode,
37{
38	#[inline]
39	#[allow(clippy::redundant_closure)]
40	fn push_async_arg(&self, serializer: &mut HexCallDataSerializer) -> Result<(), SCError> {
41		self.top_encode(AsyncCallArgOutput::new(serializer))
42			.map_err(|err| SCError::from(err))
43	}
44}
45
46impl<T> AsyncCallArg for VarArgs<T>
47where
48	T: AsyncCallArg,
49{
50	fn push_async_arg(&self, serializer: &mut HexCallDataSerializer) -> Result<(), SCError> {
51		for elem in self.0.iter() {
52			elem.push_async_arg(serializer)?;
53		}
54		Ok(())
55	}
56
57	fn push_async_arg_exact(
58		&self,
59		serializer: &mut HexCallDataSerializer,
60		expected_len: usize,
61	) -> Result<(), SCError> {
62		if self.len() != expected_len {
63			return Err(SCError::from(err_msg::ARG_ASYNC_WRONG_NUMBER));
64		}
65		self.push_async_arg(serializer)?;
66		Ok(())
67	}
68}
69
70impl<T> AsyncCallArg for OptionalArg<T>
71where
72	T: AsyncCallArg,
73{
74	#[inline]
75	fn push_async_arg(&self, serializer: &mut HexCallDataSerializer) -> Result<(), SCError> {
76		if let OptionalArg::Some(t) = self {
77			t.push_async_arg(serializer)?;
78		}
79		Ok(())
80	}
81}
82
83macro_rules! multi_result_impls {
84    ($(($mr:ident $($n:tt $name:ident)+) )+) => {
85        $(
86            impl<$($name),+> AsyncCallArg for $mr<$($name,)+>
87            where
88                $($name: AsyncCallArg,)+
89            {
90                #[inline]
91                fn push_async_arg(&self, serializer: &mut HexCallDataSerializer) -> Result<(), SCError> {
92                    $(
93                        (self.0).$n.push_async_arg(serializer)?;
94                    )+
95                    Ok(())
96                }
97            }
98        )+
99    }
100}
101
102multi_result_impls! {
103	(MultiResult1  0 T0)
104	(MultiResult2  0 T0 1 T1)
105	(MultiResult3  0 T0 1 T1 2 T2)
106	(MultiResult4  0 T0 1 T1 2 T2 3 T3)
107	(MultiResult5  0 T0 1 T1 2 T2 3 T3 4 T4)
108	(MultiResult6  0 T0 1 T1 2 T2 3 T3 4 T4 5 T5)
109	(MultiResult7  0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6)
110	(MultiResult8  0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7)
111	(MultiResult9  0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8)
112	(MultiResult10 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9)
113	(MultiResult11 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10)
114	(MultiResult12 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11)
115	(MultiResult13 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12)
116	(MultiResult14 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13)
117	(MultiResult15 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14)
118	(MultiResult16 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15)
119}