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
use crate::{helpers::WasmName, WasmSymbol};
use nyar_error::FileSpan;
use wast::{
    core::{Data, DataKind, DataVal, Expression, Instruction},
    token::{Index, NameAnnotation, Span},
};

pub struct DataItem {
    pub symbol: WasmSymbol,
    pub data: Vec<u8>,
    pub span: FileSpan,
}

impl DataItem {
    pub fn utf8(name: WasmSymbol, data: String) -> Self {
        Self { symbol: name, data: data.into_bytes(), span: FileSpan::default() }
    }

    pub(crate) fn as_wast<'a, 'i>(&'a self, start: &mut usize) -> Data<'i>
    where
        'a: 'i,
    {
        let offset = Expression { instrs: Box::new([Instruction::I32Const(*start as i32)]) };
        *start += self.data.len();
        Data {
            span: Span::from_offset(0),
            id: WasmName::id(self.symbol.as_ref()),
            name: Some(NameAnnotation { name: self.symbol.as_ref() }),
            kind: DataKind::Active { memory: Index::Id(WasmName::new("memory")), offset },
            data: vec![DataVal::String(self.data.as_slice())],
        }
    }
}