wasm_streams/
util.rs

1use js_sys::Promise;
2use wasm_bindgen::prelude::*;
3use wasm_bindgen_futures::JsFuture;
4
5pub(crate) async fn promise_to_void_future(promise: Promise) -> Result<(), JsValue> {
6    let js_value = JsFuture::from(promise).await?;
7    debug_assert!(js_value.is_undefined());
8    let _ = js_value;
9    Ok(())
10}
11
12pub(crate) fn clamp_to_u32(value: usize) -> u32 {
13    let wrapped = value as u32;
14    let overflow = value != (wrapped as usize);
15    if overflow {
16        u32::MAX
17    } else {
18        wrapped
19    }
20}
21
22pub(crate) fn clamp_to_usize(value: u32) -> usize {
23    let wrapped = value as usize;
24    let overflow = value != (wrapped as u32);
25    if overflow {
26        usize::MAX
27    } else {
28        wrapped
29    }
30}
31
32pub(crate) fn checked_cast_to_u32(value: usize) -> u32 {
33    let wrapped = value as u32;
34    debug_assert_eq!(value, wrapped as usize);
35    wrapped
36}
37
38pub(crate) fn checked_cast_to_usize(value: u32) -> usize {
39    let wrapped = value as usize;
40    debug_assert_eq!(value, wrapped as u32);
41    wrapped
42}
43
44pub(crate) fn js_to_io_error(js_value: JsValue) -> std::io::Error {
45    let message = js_to_string(&js_value).unwrap_or_else(|| "Unknown error".to_string());
46    std::io::Error::new(std::io::ErrorKind::Other, message)
47}
48
49fn js_to_string(js_value: &JsValue) -> Option<String> {
50    js_value.as_string().or_else(|| {
51        js_sys::Object::try_from(js_value)
52            .map(|js_object| js_object.to_string().as_string().unwrap_throw())
53    })
54}