use serde::Serialize;
use wasm_bindgen::prelude::*;
pub(crate) fn to_js<T: Serialize>(val: &T) -> Result<JsValue, JsError> {
let serializer = serde_wasm_bindgen::Serializer::json_compatible();
val.serialize(&serializer)
.map_err(|e| JsError::new(&e.to_string()))
}
pub(crate) fn view_as_f32(data: &[u8]) -> Result<js_sys::Float32Array, JsError> {
if data.len() % 4 != 0 {
return Err(JsError::new(&format!(
"data length {} is not a multiple of 4 (Float32)",
data.len()
)));
}
if data.is_empty() {
return Ok(js_sys::Float32Array::new_with_length(0));
}
let byte_offset = data.as_ptr() as u32;
let length = (data.len() / 4) as u32;
let memory = wasm_bindgen::memory().unchecked_into::<js_sys::WebAssembly::Memory>();
Ok(js_sys::Float32Array::new_with_byte_offset_and_length(
&memory.buffer(),
byte_offset,
length,
))
}
pub(crate) fn view_as_f64(data: &[u8]) -> Result<js_sys::Float64Array, JsError> {
if data.len() % 8 != 0 {
return Err(JsError::new(&format!(
"data length {} is not a multiple of 8 (Float64)",
data.len()
)));
}
if data.is_empty() {
return Ok(js_sys::Float64Array::new_with_length(0));
}
let byte_offset = data.as_ptr() as u32;
let length = (data.len() / 8) as u32;
let memory = wasm_bindgen::memory().unchecked_into::<js_sys::WebAssembly::Memory>();
Ok(js_sys::Float64Array::new_with_byte_offset_and_length(
&memory.buffer(),
byte_offset,
length,
))
}
pub(crate) fn view_as_i32(data: &[u8]) -> Result<js_sys::Int32Array, JsError> {
if data.len() % 4 != 0 {
return Err(JsError::new(&format!(
"data length {} is not a multiple of 4 (Int32)",
data.len()
)));
}
if data.is_empty() {
return Ok(js_sys::Int32Array::new_with_length(0));
}
let byte_offset = data.as_ptr() as u32;
let length = (data.len() / 4) as u32;
let memory = wasm_bindgen::memory().unchecked_into::<js_sys::WebAssembly::Memory>();
Ok(js_sys::Int32Array::new_with_byte_offset_and_length(
&memory.buffer(),
byte_offset,
length,
))
}
pub(crate) fn view_as_u8(data: &[u8]) -> js_sys::Uint8Array {
if data.is_empty() {
return js_sys::Uint8Array::new_with_length(0);
}
unsafe { js_sys::Uint8Array::view(data) }
}
pub(crate) fn copy_as_f32(data: &[u8]) -> Result<js_sys::Float32Array, JsError> {
let view = view_as_f32(data)?;
Ok(js_sys::Float32Array::new(&view))
}