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
68
69
use super::{DecodeError, IgnoreVisitor, Visitor};
use scale_info::PortableRegistry;
pub struct Tuple<'a, 'b> {
bytes: &'a [u8],
fields: &'b [scale_info::interner::UntrackedSymbol<std::any::TypeId>],
types: &'b PortableRegistry,
}
impl<'a, 'b> Tuple<'a, 'b> {
pub(crate) fn new(
bytes: &'a [u8],
fields: &'b [scale_info::interner::UntrackedSymbol<std::any::TypeId>],
types: &'b PortableRegistry,
) -> Tuple<'a, 'b> {
Tuple { bytes, fields, types }
}
pub(crate) fn bytes(&self) -> &'a [u8] {
self.bytes
}
pub(crate) fn skip_rest(&mut self) -> Result<(), DecodeError> {
while !self.fields.is_empty() {
self.decode_item(IgnoreVisitor)?;
}
Ok(())
}
pub fn len(&self) -> usize {
self.fields.len()
}
pub fn is_empty(&self) -> bool {
self.fields.is_empty()
}
pub fn decode_item<V: Visitor>(&mut self, visitor: V) -> Result<Option<V::Value>, V::Error> {
if self.fields.is_empty() {
return Ok(None);
}
let field = &self.fields[0];
let b = &mut self.bytes;
let res = crate::decode::decode(b, field.id(), self.types, visitor);
self.fields = &self.fields[1..];
self.bytes = *b;
res.map(Some)
}
}