use crate::MAX_INSTRUCTIONS_TO_DECODE;
use alloc::vec::Vec;
use codec::{decode_vec_with_len, Compact, Decode};
environmental::environmental!(instructions_count: u8);
pub fn decode_xcm_instructions<I: codec::Input, T: Decode>(
input: &mut I,
) -> Result<Vec<T>, codec::Error> {
instructions_count::using_once(&mut 0, || {
let vec_len: u32 = <Compact<u32>>::decode(input)?.into();
instructions_count::with(|count| {
*count = count.saturating_add(vec_len as u8);
if *count > MAX_INSTRUCTIONS_TO_DECODE {
return Err(codec::Error::from("Max instructions exceeded"));
}
Ok(())
})
.unwrap_or(Err(codec::Error::from("Error calling `instructions_count::with()`")))?;
let decoded_instructions = decode_vec_with_len(input, vec_len as usize)?;
Ok(decoded_instructions)
})
}