js_object/
lib.rs

1#![feature(specialization, proc_macro_hygiene)]
2
3use js_sys::{Object, Reflect};
4use wasm_bindgen::JsValue;
5
6#[doc(hidden)]
7pub trait JsObjectValue__ {
8	fn js_object_set__(self, obj: &Object, key: &JsValue);
9}
10
11impl<T: Into<JsValue>> JsObjectValue__ for T {
12	#[inline(always)]
13	default fn js_object_set__(self, obj: &Object, key: &JsValue) {
14		let value = self.into();
15		Reflect::set(obj, key, &value).unwrap();
16	}
17}
18
19
20impl JsObjectValue__ for &JsValue {
21	#[inline(always)]
22	fn js_object_set__(self, obj: &Object, key: &JsValue) {
23		Reflect::set(obj, key, self).unwrap();
24	}
25}
26
27
28/// Helper for creating Object instances
29#[macro_export]
30macro_rules! js_object {
31	($($key:expr, $value:expr),+) => {
32		{
33			use js_intern::{js_intern, try_js_intern};
34
35			let o = js_sys::Object::new();
36			$(
37				{
38					let k = js_intern!($key);
39					let v = try_js_intern!($value);
40					$crate::JsObjectValue__::js_object_set__(v, &o, k);
41				}
42			)*
43			o
44		}
45	};
46}
47