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
use crate::{BinaryReader, ComponentTypeRef, FromReader, Result, SectionLimited};
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum ComponentExternalKind {
Module,
Func,
Value,
Type,
Instance,
Component,
}
impl ComponentExternalKind {
pub(crate) fn from_bytes(
byte1: u8,
byte2: Option<u8>,
offset: usize,
) -> Result<ComponentExternalKind> {
Ok(match byte1 {
0x00 => match byte2.unwrap() {
0x11 => ComponentExternalKind::Module,
x => {
return Err(BinaryReader::invalid_leading_byte_error(
x,
"component external kind",
offset + 1,
))
}
},
0x01 => ComponentExternalKind::Func,
0x02 => ComponentExternalKind::Value,
0x03 => ComponentExternalKind::Type,
0x04 => ComponentExternalKind::Component,
0x05 => ComponentExternalKind::Instance,
x => {
return Err(BinaryReader::invalid_leading_byte_error(
x,
"component external kind",
offset,
))
}
})
}
}
#[derive(Debug, Clone)]
pub struct ComponentExport<'a> {
pub name: &'a str,
pub url: &'a str,
pub kind: ComponentExternalKind,
pub index: u32,
pub ty: Option<ComponentTypeRef>,
}
pub type ComponentExportSectionReader<'a> = SectionLimited<'a, ComponentExport<'a>>;
impl<'a> FromReader<'a> for ComponentExport<'a> {
fn from_reader(reader: &mut BinaryReader<'a>) -> Result<Self> {
Ok(ComponentExport {
name: reader.read()?,
url: reader.read()?,
kind: reader.read()?,
index: reader.read()?,
ty: match reader.read_u8()? {
0x00 => None,
0x01 => Some(reader.read()?),
other => {
return Err(BinaryReader::invalid_leading_byte_error(
other,
"optional component export type",
reader.original_position() - 1,
))
}
},
})
}
}
impl<'a> FromReader<'a> for ComponentExternalKind {
fn from_reader(reader: &mut BinaryReader<'a>) -> Result<Self> {
let offset = reader.original_position();
let byte1 = reader.read_u8()?;
let byte2 = if byte1 == 0x00 {
Some(reader.read_u8()?)
} else {
None
};
ComponentExternalKind::from_bytes(byte1, byte2, offset)
}
}