1use wasm_bindgen::prelude::*;
2
3#[wasm_bindgen]
4extern "C" {
5 type ObjectConstructor;
6
7 #[wasm_bindgen(method, structural, getter)]
8 fn prototype(this: &ObjectConstructor) -> js_sys::Object;
9
10 static Object: ObjectConstructor;
11}
12
13fn impl_is_empty_object(obj: &js_sys::Object) -> bool {
14 let keys = js_sys::Reflect::own_keys(&obj).unwrap();
15 keys.length() == 0 && {
16 let json = js_sys::JSON::stringify(&obj);
17 json == Ok(js_sys::JsString::from("{}"))
18 }
19}
20
21pub fn is_empty_object_with_object_proto(obj: &js_sys::Object) -> bool {
22 !obj.is_null()
23 && {
24 let proto = js_sys::Reflect::get_prototype_of(obj.as_ref()).unwrap();
25 proto == (&*Object).prototype()
26 }
27 && impl_is_empty_object(obj)
28}
29
30pub fn is_empty_object_with_null_proto(obj: &js_sys::Object) -> bool {
31 !obj.is_null()
32 && {
33 let proto = js_sys::Reflect::get_prototype_of(obj.as_ref()).unwrap();
34 proto.is_null()
35 }
36 && impl_is_empty_object(obj)
37}
38
39pub fn is_empty_object(obj: &js_sys::Object) -> bool {
40 is_empty_object_with_object_proto(obj) || is_empty_object_with_null_proto(obj)
41}