convert_js/
lib.rs

1mod to_js;
2pub use to_js::*;
3
4mod from_js;
5pub use from_js::*;
6
7mod option_like;
8pub use option_like::*;
9
10pub use Maybe::*;
11pub use Nullable::*;
12
13mod js_cast;
14pub use js_cast::*;
15
16pub use js_sys;
17
18pub use convert_js_macros::ToJs;
19
20#[path = "./internal/mod.rs"]
21pub mod __internal;
22
23#[macro_export]
24macro_rules! jsv {
25    (undefined) => {
26        $crate::__internal::JsValue::UNDEFINED
27    };
28    (null) => {
29        $crate::__internal::JsValue::NULL
30    };
31    ($v:literal) => {
32        $crate::__internal::JsValue::from($v)
33    };
34    ({}) => {
35        $crate::js_sys::Object::new()
36    };
37    ({ $( $k:tt $(: $v:expr)? ),+ $(,)? }) => {{
38        let __obj = $crate::__internal::JsObject::new();
39        $(
40            $crate::jsv!(@impl set_prop_and_check
41                __obj
42                ($k)
43                $(: $v)?
44            );
45        )+
46        __obj.into_inner()
47    }};
48    (@impl set_prop_and_check $obj:ident ($k:tt) : $v:expr ) => {
49        $obj.set_prop(
50            &($crate::jsv!(@impl resolve_prop_key $k)),
51            &($v),
52        )
53    };
54    (@impl set_prop_and_check $obj:ident ($k:tt) ) => {
55        $obj.set_prop(
56            &($crate::jsv!(@impl resolve_prop_key $k)),
57            &($k),
58        )
59    };
60    (@impl resolve_prop_key $k:ident) => { stringify!($k) };
61    (@impl resolve_prop_key $k:literal) => { $k };
62    (@impl resolve_prop_key [$k:expr]) => { $crate::jsv!(# $k) };
63    (@impl resolve_prop_key $k:tt) => {
64        compile_error!(concat!("invalid syntax for js object property key: ", stringify!($k)))
65    };
66    ([]) => {
67        $crate::js_sys::Array::new()
68    };
69    ([ $($arr_item:expr),+ $(,)? ]) => {
70        $crate::js_sys::Array::from_iter([
71            $(
72                $crate::ToJs::to_js(&($arr_item))
73            ),+
74        ])
75    };
76}