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 elrond_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); } } }