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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
use super::{DecodeError, IgnoreVisitor, Visitor};
use scale_info::PortableRegistry;
pub struct Sequence<'a, 'b> {
bytes: &'a [u8],
type_id: u32,
types: &'b PortableRegistry,
remaining: usize,
}
impl<'a, 'b> Sequence<'a, 'b> {
pub(crate) fn new(
bytes: &'a [u8],
type_id: u32,
len: usize,
types: &'b PortableRegistry,
) -> Sequence<'a, 'b> {
Sequence { bytes, type_id, types, remaining: len }
}
pub(crate) fn bytes(&self) -> &'a [u8] {
self.bytes
}
pub(crate) fn skip_rest(&mut self) -> Result<(), DecodeError> {
while self.remaining > 0 {
self.decode_item(IgnoreVisitor)?;
}
Ok(())
}
pub fn len(&self) -> usize {
self.remaining
}
pub fn is_empty(&self) -> bool {
self.remaining == 0
}
pub fn decode_item<V: Visitor>(&mut self, visitor: V) -> Result<Option<V::Value>, V::Error> {
if self.remaining == 0 {
return Ok(None);
}
let b = &mut self.bytes;
let res = crate::decode::decode(b, self.type_id, self.types, visitor);
self.bytes = *b;
self.remaining -= 1;
res.map(Some)
}
}