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
70
71
72
73
74
use super::{DecodeError, IgnoreVisitor, Visitor};
use scale_info::{form::PortableForm, Field, PortableRegistry};
pub struct Composite<'a, 'b> {
bytes: &'a [u8],
fields: &'b [Field<PortableForm>],
types: &'b PortableRegistry,
}
impl<'a, 'b> Composite<'a, 'b> {
pub(crate) fn new(
bytes: &'a [u8],
fields: &'b [Field<PortableForm>],
types: &'b PortableRegistry,
) -> Composite<'a, 'b> {
Composite { 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 fields(&self) -> &'b [Field<PortableForm>] {
self.fields
}
pub fn decode_item<V: Visitor>(&mut self, visitor: V) -> Result<Option<V::Value>, V::Error> {
self.decode_item_with_name(visitor).map(|o| o.map(|(_n, v)| v))
}
pub fn decode_item_with_name<V: Visitor>(
&mut self,
visitor: V,
) -> Result<Option<(&'b str, V::Value)>, V::Error> {
if self.fields.is_empty() {
return Ok(None);
}
let field = &self.fields[0];
let field_name = self.fields.get(0).and_then(|f| f.name().map(|n| &**n)).unwrap_or("");
let b = &mut self.bytes;
let res = crate::decode::decode(b, field.ty().id(), self.types, visitor);
self.bytes = *b;
self.fields = &self.fields[1..];
res.map(|val| Some((field_name, val)))
}
}