use crate::component::*; use crate::core; use crate::kw; use crate::parser::{Parse, Parser, Result}; use crate::token::{Id, NameAnnotation, Span}; /// A core WebAssembly module to be created as part of a component. /// /// This is a member of the core module section. #[derive(Debug)] pub struct CoreModule<'a> { /// Where this `core module` was defined. pub span: Span, /// An identifier that this module is resolved with (optionally) for name /// resolution. pub id: Option>, /// An optional name for this module stored in the custom `name` section. pub name: Option>, /// If present, inline export annotations which indicate names this /// definition should be exported under. pub exports: InlineExport<'a>, /// What kind of module this is, be it an inline-defined or imported one. pub kind: CoreModuleKind<'a>, } /// Possible ways to define a core module in the text format. #[derive(Debug)] pub enum CoreModuleKind<'a> { /// A core module which is actually defined as an import Import { /// Where this core module is imported from import: InlineImport<'a>, /// The type that this core module will have. ty: CoreTypeUse<'a, ModuleType<'a>>, }, /// Modules that are defined inline. Inline { /// Fields in the core module. fields: Vec>, }, } impl<'a> Parse<'a> for CoreModule<'a> { fn parse(parser: Parser<'a>) -> Result { parser.depth_check()?; let span = parser.parse::()?.0; parser.parse::()?; let id = parser.parse()?; let name = parser.parse()?; let exports = parser.parse()?; let kind = if let Some(import) = parser.parse()? { CoreModuleKind::Import { import, ty: parser.parse()?, } } else { let mut fields = Vec::new(); while !parser.is_empty() { fields.push(parser.parens(|p| p.parse())?); } CoreModuleKind::Inline { fields } }; Ok(Self { span, id, name, exports, kind, }) } }