fce_wit_parser/
embedder.rs1use super::custom::ITCustomSection;
18use super::errors::WITParserError;
19use crate::Result;
20
21use walrus::ModuleConfig;
22use wasmer_wit::{
23 ast::Interfaces,
24 decoders::wat::{parse, Buffer},
25};
26use wasmer_wit::ToBytes;
27
28use std::path::Path;
29
30pub fn embed_text_wit<I, O>(in_wasm_path: I, out_wasm_path: O, wit: &str) -> Result<()>
32where
33 I: AsRef<Path>,
34 O: AsRef<Path>,
35{
36 let module = ModuleConfig::new()
37 .parse_file(in_wasm_path)
38 .map_err(WITParserError::CorruptedWasmFile)?;
39
40 let buffer = Buffer::new(wit)?;
41 let ast = parse(&buffer)?;
42
43 let mut module = embed_wit(module, &ast);
44 module
45 .emit_wasm_file(out_wasm_path)
46 .map_err(WITParserError::WasmEmitError)?;
47
48 Ok(())
49}
50
51pub fn embed_wit(mut wasm_module: walrus::Module, interfaces: &Interfaces<'_>) -> walrus::Module {
53 let mut bytes = vec![];
54 interfaces.to_bytes(&mut bytes).unwrap();
56
57 let custom = ITCustomSection(bytes);
58 wasm_module.customs.add(custom);
59
60 wasm_module
61}