use miden_client::SliceReader;
use miden_client::utils::{Deserializable, Serializable};
use crate::js_error_with_context;
use crate::platform::{JsBytes, JsErr, bytes_to_js};
#[cfg(all(feature = "testing", feature = "browser"))]
pub mod test_utils;
pub fn serialize_to_bytes<T: Serializable>(value: &T) -> JsBytes {
let mut buffer = Vec::new();
value.write_into(&mut buffer);
bytes_to_js(&buffer)
}
pub fn deserialize_from_bytes<T: Deserializable>(bytes: &JsBytes) -> Result<T, JsErr> {
let vec = crate::platform::js_to_bytes(bytes);
let mut reader = SliceReader::new(&vec);
let context = alloc::format!("failed to deserialize {}", core::any::type_name::<T>());
T::read_from(&mut reader).map_err(|e| js_error_with_context(e, &context))
}
#[cfg(test)]
mod tests {
use miden_client::utils::{ByteReader, DeserializationError};
use super::*;
#[derive(Debug)]
struct MockFailureType;
impl Deserializable for MockFailureType {
fn read_from<R: ByteReader>(_source: &mut R) -> Result<Self, DeserializationError> {
Err(DeserializationError::InvalidValue("mock error".to_string()))
}
}
#[cfg(feature = "browser")]
#[test]
fn deserialize_from_bytes_failure_with_type_context() {
use wasm_bindgen_futures::js_sys::Uint8Array;
let uint8_array = Uint8Array::new_with_length(10);
let result = deserialize_from_bytes::<MockFailureType>(&uint8_array);
assert!(result.is_err());
let error = result.unwrap_err();
let error_string = error.as_string().unwrap();
assert!(error_string.contains("MockFailureType"));
assert!(error_string.contains("failed to deserialize"));
assert!(error_string.contains("mock error"));
}
}