use crate::{helpers::map_js_error, *};
use js_sys::{Uint8Array, WebAssembly};
#[derive(Clone, Debug)]
pub struct Module {
pub(crate) module: WebAssembly::Module,
}
impl Module {
pub fn new(_engine: &Engine, bytes: impl AsRef<[u8]>) -> Result<Self> {
let bytes = bytes.as_ref();
Self::from_bytes(bytes).or_else(|err| Self::from_wat(bytes, err))
}
#[cfg(feature = "wat")]
fn from_wat(wat: &[u8], original_err: Error) -> Result<Self> {
let text: &str = std::str::from_utf8(wat).map_err(move |_| original_err)?;
let bytes = wat::parse_str(text)?;
Self::from_bytes(&bytes)
}
#[cfg(not(feature = "wat"))]
fn from_wat(_wat: &[u8], original_err: Error) -> Result<Self> {
Err(original_err)
}
fn from_bytes(bytes: &[u8]) -> Result<Self> {
let byte_array = Uint8Array::from(bytes);
let module = WebAssembly::Module::new(&byte_array.into())
.map_err(map_js_error("New WebAssembly module from bytes"))?;
Ok(Self { module })
}
}