multiversx_sc_codec/multi/
top_de_multi_input.rsuse alloc::{boxed::Box, vec::Vec};
use crate::{DecodeError, DecodeErrorHandler, TopDecode, TopDecodeInput};
pub trait TopDecodeMultiInput: Sized {
type ValueInput: TopDecodeInput;
fn has_next(&self) -> bool;
fn next_value_input<H>(&mut self, h: H) -> Result<Self::ValueInput, H::HandledErr>
where
H: DecodeErrorHandler;
fn next_value<T, H>(&mut self, h: H) -> Result<T, H::HandledErr>
where
T: TopDecode,
H: DecodeErrorHandler,
{
T::top_decode_or_handle_err(self.next_value_input(h)?, h)
}
fn assert_no_more_args<H>(&self, h: H) -> Result<(), H::HandledErr>
where
H: DecodeErrorHandler,
{
if self.has_next() {
Err(h.handle_error(DecodeError::MULTI_TOO_MANY_ARGS))
} else {
Ok(())
}
}
fn flush_ignore<H>(&mut self, h: H) -> Result<(), H::HandledErr>
where
H: DecodeErrorHandler,
{
while self.has_next() {
let _ = self.next_value_input(h)?;
}
Ok(())
}
}
impl TopDecodeMultiInput for Vec<Vec<u8>> {
type ValueInput = Box<[u8]>;
fn has_next(&self) -> bool {
!self.is_empty()
}
fn next_value_input<H>(&mut self, h: H) -> Result<Self::ValueInput, H::HandledErr>
where
H: DecodeErrorHandler,
{
if self.has_next() {
let first = core::mem::take(&mut self[0]);
let tail = self.split_off(1);
*self = tail;
Ok(first.into_boxed_slice())
} else {
Err(h.handle_error(DecodeError::MULTI_TOO_FEW_ARGS))
}
}
}