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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
use molecule::{pack_number, Number, NUMBER_SIZE};
pub trait DefaultContent {
fn default_content(&self) -> Vec<u8>;
}
impl DefaultContent for super::Primitive {
fn default_content(&self) -> Vec<u8> {
vec![0]
}
}
impl DefaultContent for super::Option_ {
fn default_content(&self) -> Vec<u8> {
Vec::new()
}
}
impl DefaultContent for super::Union {
fn default_content(&self) -> Vec<u8> {
let item_id = 0;
let inner_content = self.items()[item_id].typ.default_content();
let total_size = NUMBER_SIZE + inner_content.len();
let mut content = Vec::with_capacity(total_size);
content.extend_from_slice(&pack_number(item_id as Number));
content.extend_from_slice(&inner_content);
content
}
}
impl DefaultContent for super::Array {
fn default_content(&self) -> Vec<u8> {
vec![0; self.total_size()]
}
}
impl DefaultContent for super::Struct {
fn default_content(&self) -> Vec<u8> {
vec![0; self.total_size()]
}
}
impl DefaultContent for super::FixVec {
fn default_content(&self) -> Vec<u8> {
let item_count = 0;
let mut content = Vec::with_capacity(NUMBER_SIZE);
content.extend_from_slice(&pack_number(item_count as Number));
content
}
}
impl DefaultContent for super::DynVec {
fn default_content(&self) -> Vec<u8> {
let total_size = NUMBER_SIZE;
let mut content = Vec::with_capacity(NUMBER_SIZE);
content.extend_from_slice(&pack_number(total_size as Number));
content
}
}
impl DefaultContent for super::Table {
fn default_content(&self) -> Vec<u8> {
let field_count = self.fields().len();
let (total_size, content) = if field_count == 0 {
let total_size = NUMBER_SIZE;
let mut content = Vec::with_capacity(total_size);
content.extend_from_slice(&pack_number(total_size as Number));
(total_size, content)
} else {
let (total_size, offsets, field_data) = self.fields().iter().fold(
(
NUMBER_SIZE * (field_count + 1),
Vec::with_capacity(field_count),
Vec::with_capacity(field_count),
),
|(mut current_offset, mut offsets, mut field_data), field| {
offsets.push(current_offset);
let data = field.typ.default_content();
current_offset += data.len();
field_data.push(data);
(current_offset, offsets, field_data)
},
);
let mut content = Vec::with_capacity(total_size);
content.extend_from_slice(&pack_number(total_size as Number));
for offset in offsets.into_iter() {
content.extend_from_slice(&pack_number(offset as Number));
}
for data in field_data.into_iter() {
content.extend_from_slice(&data);
}
(total_size, content)
};
assert_eq!(content.len(), total_size);
content
}
}
impl DefaultContent for super::TopDecl {
fn default_content(&self) -> Vec<u8> {
match self {
super::TopDecl::Primitive(inner) => inner.default_content(),
super::TopDecl::Option_(inner) => inner.default_content(),
super::TopDecl::Union(inner) => inner.default_content(),
super::TopDecl::Array(inner) => inner.default_content(),
super::TopDecl::Struct(inner) => inner.default_content(),
super::TopDecl::FixVec(inner) => inner.default_content(),
super::TopDecl::DynVec(inner) => inner.default_content(),
super::TopDecl::Table(inner) => inner.default_content(),
}
}
}