lit_utilities_wasm/
abi.rs1use 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}