convert-js 1.0.0-alpha.15

Convert rust wasm from/to js
Documentation
use convert_js::{Maybe, Nullable, ToJs};
use wasm_bindgen::{JsCast, JsValue};
use wasm_bindgen_test::wasm_bindgen_test;

#[wasm_bindgen_test]
fn tuple_as_js() {
    assert!(().to_js().is_undefined());

    {
        let js = (
            (),
            1,
            "2",
            JsValue::from_f64(3.0),
            Nullable::NonNull(4u128),
            Maybe::Defined(false),
        )
            .to_js();

        let arr: js_sys::Array = js.dyn_into().unwrap();

        assert_eq!(arr.length(), 6);
        assert!(arr.get(0).is_undefined());
        assert_eq!(arr.get(1), 1);
        assert_eq!(arr.get(2), "2");
        assert_eq!(arr.get(3), 3.0);
        assert!(arr.get(4).is_bigint());
        assert_eq!(arr.get(4), 4u128);
        assert_eq!(arr.get(5), false);
    }
}

#[wasm_bindgen_test]
fn array_as_js() {
    let js = [Some(1), None, Some(-1)].to_js();
    let arr: js_sys::Array = js.dyn_into().unwrap();

    assert_eq!(arr.length(), 3);
    assert_eq!(arr.get(0), 1);
    assert!(arr.get(1).is_undefined());
    assert_eq!(arr.get(2), -1);
}

#[wasm_bindgen_test]
fn vec_as_js() {
    use convert_js::Nullable;
    let js = vec![
        Nullable::Null,
        Nullable::NonNull(Box::new("1")),
        Nullable::NonNull(Box::new("2")),
    ]
    .to_js();
    let arr: js_sys::Array = js.dyn_into().unwrap();

    assert_eq!(arr.length(), 3);
    assert!(arr.get(0).is_null());
    assert_eq!(arr.get(1), "1");
    assert_eq!(arr.get(2), "2");
}

#[wasm_bindgen_test]
fn slice_as_js() {
    let slice = "abcde".as_bytes();

    let js = slice.to_js();
    let arr: js_sys::Array = js.dyn_into().unwrap();

    assert_eq!(arr.length(), 5);
    assert_eq!(arr.get(0), 97);
    assert_eq!(arr.get(1), 98);
    assert_eq!(arr.get(2), 99);
    assert_eq!(arr.get(3), 100);
    assert_eq!(arr.get(4), 101);
}

#[wasm_bindgen_test]
fn closure_as_js() {
    use std::{cell::RefCell, rc::Rc};
    use wasm_bindgen::closure::Closure;

    let a = Rc::new(RefCell::new(0));
    let closure = Closure::wrap(Box::new({
        let a = Rc::clone(&a);
        move || {
            let mut a = a.borrow_mut();
            *a += 1;
        }
    }) as Box<dyn FnMut()>);

    let args = js_sys::Array::new();
    js_sys::Reflect::apply(closure.as_ref().dyn_ref().unwrap(), &JsValue::NULL, &args).unwrap();
    js_sys::Reflect::apply(closure.as_ref().dyn_ref().unwrap(), &JsValue::NULL, &args).unwrap();
    js_sys::Reflect::apply(closure.as_ref().dyn_ref().unwrap(), &JsValue::NULL, &args).unwrap();

    assert_eq!(*a.borrow(), 3);
}