lit_utilities_wasm/
abi.rs

1//! Utilities from converting to/from JS
2
3use std::convert::TryFrom;
4
5use js_sys::Uint8Array;
6use serde::{de::DeserializeOwned, Serialize};
7use serde_bytes::Bytes;
8use wasm_bindgen::{JsCast, JsError, JsValue};
9
10pub type JsResult<T> = Result<T, JsError>;
11
12pub fn from_js<T: DeserializeOwned>(value: impl Into<JsValue>) -> JsResult<T> {
13    serde_wasm_bindgen::from_value::<T>(value.into()).map_err(Into::into)
14}
15
16pub fn into_js<T: JsCast>(value: &(impl Serialize + ?Sized)) -> JsResult<T> {
17    let value = serde_wasm_bindgen::to_value(value)?;
18    let value = value
19        .dyn_into()
20        .map_err(|v| JsError::new(&format!("unexpected serializer output type: {:?}", v)))?;
21    Ok(value)
22}
23
24pub fn from_uint8array<T: TryFrom<Vec<u8>>>(value: Uint8Array) -> JsResult<T> {
25    let value = from_js::<Vec<u8>>(value)?;
26    let value = T::try_from(value);
27    let value = value
28        .ok()
29        .ok_or_else(|| JsError::new("cannot deserialize"))?;
30
31    Ok(value)
32}
33
34pub fn into_uint8array<T: JsCast>(value: impl AsRef<[u8]>) -> JsResult<T> {
35    into_js(Bytes::new(value.as_ref()))
36}