use std::sync::Arc;
use anyhow::bail;
use anyhow::Result;
use super::create_identity_import_object;
use super::load_instance::load_instance;
use super::load_instance::WasmModuleCreator;
use super::InitializedWasmPlugin;
use crate::environment::Environment;
use crate::plugins::CompilationResult;
pub fn compile(wasm_bytes: &[u8], environment: impl Environment) -> Result<CompilationResult> {
let wasm_module_creator = WasmModuleCreator::default();
let module = wasm_module_creator.create_from_wasm_bytes(wasm_bytes)?;
let bytes = match module.serialize() {
Ok(bytes) => bytes,
Err(err) => bail!("Error serializing wasm module: {:#}", err),
};
let plugin = InitializedWasmPlugin::new(
"compiling".to_string(),
module,
Arc::new(move |store, module| {
let imports = create_identity_import_object(store);
load_instance(store, module, &imports)
}),
Default::default(),
Default::default(),
environment,
);
Ok(CompilationResult {
bytes: bytes.into(),
plugin_info: plugin.get_plugin_info()?,
})
}