1use crate::core::binary::EncodeOptions;
2use crate::core::*;
3use crate::parser::{Parse, Parser, Result};
4use crate::token::{Id, Index, NameAnnotation, Span};
5use crate::{annotation, kw};
6
7pub use crate::core::resolve::Names;
8
9#[derive(Debug)]
11pub struct Module<'a> {
12 pub span: Span,
14 pub id: Option<Id<'a>>,
16 pub name: Option<NameAnnotation<'a>>,
18 pub kind: ModuleKind<'a>,
20}
21
22#[derive(Debug)]
24pub enum ModuleKind<'a> {
25 Text(Vec<ModuleField<'a>>),
27 Binary(Vec<&'a [u8]>),
30}
31
32impl<'a> Module<'a> {
33 pub fn resolve(&mut self) -> std::result::Result<Names<'a>, crate::Error> {
57 let names = match &mut self.kind {
58 ModuleKind::Text(fields) => crate::core::resolve::resolve(fields)?,
59 ModuleKind::Binary(_blobs) => Default::default(),
60 };
61 Ok(names)
62 }
63
64 pub fn encode(&mut self) -> std::result::Result<Vec<u8>, crate::Error> {
89 EncodeOptions::default().encode_module(self)
90 }
91
92 pub(crate) fn parse_without_module_keyword(
93 module_keyword_span: Span,
94 parser: Parser<'a>,
95 ) -> Result<Self> {
96 let id = parser.parse()?;
97 let name = parser.parse()?;
98
99 let kind = if parser.peek::<kw::binary>()? {
100 parser.parse::<kw::binary>()?;
101 let mut data = Vec::new();
102 while !parser.is_empty() {
103 data.push(parser.parse()?);
104 }
105 ModuleKind::Binary(data)
106 } else {
107 ModuleKind::Text(ModuleField::parse_remaining(parser)?)
108 };
109 Ok(Module {
110 span: module_keyword_span,
111 id,
112 name,
113 kind,
114 })
115 }
116}
117
118impl<'a> Parse<'a> for Module<'a> {
119 fn parse(parser: Parser<'a>) -> Result<Self> {
120 parser.with_standard_annotations_registered(|parser| {
121 let span = parser.parse::<kw::module>()?.0;
122 Self::parse_without_module_keyword(span, parser)
123 })
124 }
125}
126
127#[allow(missing_docs)]
129#[derive(Debug)]
130pub enum ModuleField<'a> {
131 Type(Type<'a>),
132 Rec(Rec<'a>),
133 Import(Import<'a>),
134 Func(Func<'a>),
135 Table(Table<'a>),
136 Memory(Memory<'a>),
137 Global(Global<'a>),
138 Export(Export<'a>),
139 Start(Index<'a>),
140 Elem(Elem<'a>),
141 Data(Data<'a>),
142 Tag(Tag<'a>),
143 Custom(Custom<'a>),
144}
145
146impl<'a> ModuleField<'a> {
147 pub(crate) fn parse_remaining(parser: Parser<'a>) -> Result<Vec<ModuleField<'a>>> {
148 let mut fields = Vec::new();
149 while !parser.is_empty() {
150 fields.push(parser.parens(ModuleField::parse)?);
151 }
152 Ok(fields)
153 }
154}
155
156impl<'a> Parse<'a> for ModuleField<'a> {
157 fn parse(parser: Parser<'a>) -> Result<Self> {
158 if parser.peek::<Type<'a>>()? {
159 return Ok(ModuleField::Type(parser.parse()?));
160 }
161 if parser.peek::<kw::rec>()? {
162 return Ok(ModuleField::Rec(parser.parse()?));
163 }
164 if parser.peek::<kw::import>()? {
165 return Ok(ModuleField::Import(parser.parse()?));
166 }
167 if parser.peek::<kw::func>()? {
168 return Ok(ModuleField::Func(parser.parse()?));
169 }
170 if parser.peek::<kw::table>()? {
171 return Ok(ModuleField::Table(parser.parse()?));
172 }
173 if parser.peek::<kw::memory>()? {
174 return Ok(ModuleField::Memory(parser.parse()?));
175 }
176 if parser.peek::<kw::global>()? {
177 return Ok(ModuleField::Global(parser.parse()?));
178 }
179 if parser.peek::<kw::export>()? {
180 return Ok(ModuleField::Export(parser.parse()?));
181 }
182 if parser.peek::<kw::start>()? {
183 parser.parse::<kw::start>()?;
184 return Ok(ModuleField::Start(parser.parse()?));
185 }
186 if parser.peek::<kw::elem>()? {
187 return Ok(ModuleField::Elem(parser.parse()?));
188 }
189 if parser.peek::<kw::data>()? {
190 return Ok(ModuleField::Data(parser.parse()?));
191 }
192 if parser.peek::<kw::tag>()? {
193 return Ok(ModuleField::Tag(parser.parse()?));
194 }
195 if parser.peek::<annotation::custom>()?
196 || parser.peek::<annotation::producers>()?
197 || parser.peek::<annotation::dylink_0>()?
198 {
199 return Ok(ModuleField::Custom(parser.parse()?));
200 }
201 Err(parser.error("expected valid module field"))
202 }
203}