numbat_wasm/io/
arg_serialize.rs1use 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}