use crate::{encode_section, ComponentSection, ComponentSectionId, Encode};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AliasExportKind {
Module,
Component,
Instance,
ComponentFunction,
Value,
Function,
Table,
Memory,
Global,
Tag,
}
impl Encode for AliasExportKind {
fn encode(&self, sink: &mut Vec<u8>) {
let (preamble, value) = match self {
AliasExportKind::Module => (0x00, 0x00),
AliasExportKind::Component => (0x00, 0x01),
AliasExportKind::Instance => (0x00, 0x02),
AliasExportKind::ComponentFunction => (0x00, 0x03),
AliasExportKind::Value => (0x00, 0x04),
AliasExportKind::Function => (0x01, 0x00),
AliasExportKind::Table => (0x01, 0x01),
AliasExportKind::Memory => (0x01, 0x02),
AliasExportKind::Global => (0x01, 0x03),
AliasExportKind::Tag => (0x01, 0x04),
};
sink.push(preamble);
sink.push(value);
}
}
#[derive(Clone, Debug, Default)]
pub struct AliasSection {
bytes: Vec<u8>,
num_added: u32,
}
impl AliasSection {
pub fn new() -> Self {
Self::default()
}
pub fn len(&self) -> u32 {
self.num_added
}
pub fn is_empty(&self) -> bool {
self.num_added == 0
}
pub fn instance_export(
&mut self,
instance: u32,
kind: AliasExportKind,
name: &str,
) -> &mut Self {
kind.encode(&mut self.bytes);
instance.encode(&mut self.bytes);
name.encode(&mut self.bytes);
self.num_added += 1;
self
}
pub fn outer_type(&mut self, count: u32, index: u32) -> &mut Self {
self.bytes.push(0x02);
self.bytes.push(0x05);
count.encode(&mut self.bytes);
index.encode(&mut self.bytes);
self.num_added += 1;
self
}
pub fn outer_module(&mut self, count: u32, index: u32) -> &mut Self {
self.bytes.push(0x02);
self.bytes.push(0x00);
count.encode(&mut self.bytes);
index.encode(&mut self.bytes);
self.num_added += 1;
self
}
pub fn outer_component(&mut self, count: u32, index: u32) -> &mut Self {
self.bytes.push(0x02);
self.bytes.push(0x01);
count.encode(&mut self.bytes);
index.encode(&mut self.bytes);
self.num_added += 1;
self
}
}
impl Encode for AliasSection {
fn encode(&self, sink: &mut Vec<u8>) {
encode_section(sink, ComponentSectionId::Alias, self.num_added, &self.bytes);
}
}
impl ComponentSection for AliasSection {}