1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
use crate::api::ErrorApi;
use crate::hex_call_data::*;
use crate::*;

pub struct CallDataArgLoader<'a, SE>
where
	SE: ErrorApi,
{
	deser: HexCallDataDeserializer<'a>,
	signal_error: SE,
}

impl<'a, SE> CallDataArgLoader<'a, SE>
where
	SE: ErrorApi,
{
	pub fn new(deser: HexCallDataDeserializer<'a>, signal_error: SE) -> Self {
		CallDataArgLoader {
			deser,
			signal_error,
		}
	}
}

impl<'a, SE> ErrorApi for CallDataArgLoader<'a, SE>
where
	SE: ErrorApi,
{
	#[inline]
	fn signal_error(&self, message: &[u8]) -> ! {
		self.signal_error.signal_error(message)
	}
}

impl<'a, SE> DynArgInput<Vec<u8>> for CallDataArgLoader<'a, SE>
where
	SE: ErrorApi,
{
	#[inline]
	fn has_next(&self) -> bool {
		self.deser.has_next()
	}

	fn next_arg_input(&mut self) -> Vec<u8> {
		match self.deser.next_argument() {
			Ok(Some(arg_bytes)) => arg_bytes,
			Ok(None) => self.signal_error(err_msg::ARG_WRONG_NUMBER),
			Err(sc_err) => self.signal_error(sc_err.as_bytes()),
		}
	}
}