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
use crate::api::ErrorApi;
use crate::err_msg;
use dharitri_codec::TopDecodeInput;

/// Abstracts away the loading of multi-arguments.
/// Acts as an abstract source for these arguments.
///
/// The main method, `next_arg_input` will provide a decode input,
/// from which any deserializable object can be deserialized.
///
/// Structs implementing this trait are also responsible with
/// error handling, such as:
/// - deserialization errors
/// - insufficient arguments
/// - too many arguments
/// For this reason it also requires the ErrorApi trait.
///
/// There are 2 main scenarios for it:
/// - deserializing endpoint arguments directly from the API
/// - deserializing callback arguments saved to storage, from a call data string
///
pub trait DynArgInput<I: TopDecodeInput>: ErrorApi + Sized {
	/// Check if there are more arguments that can be loaded.
	fn has_next(&self) -> bool;

	/// Retrieves an input for deserializing an argument.
	/// If the loader is out of arguments, it will crash by itself with an appropriate error,
	/// without returning.
	/// Use if the next argument is optional, use `has_next` beforehand.
	fn next_arg_input(&mut self) -> I;

	/// Called after retrieving all arguments to validate that extra arguments were not provided.
	fn assert_no_more_args(&self) {
		if self.has_next() {
			self.signal_error(err_msg::ARG_WRONG_NUMBER);
		}
	}
}