1use js_sys::Object;
2use wasm_bindgen::{prelude::*, JsCast};
3
4#[wasm_bindgen]
5extern "C" {
6 #[wasm_bindgen(extends = Object)]
7 pub type ObjectExt;
8
9 #[wasm_bindgen(method, indexing_setter)]
10 pub fn set(this: &ObjectExt, key: &str, value: JsValue);
11
12 #[wasm_bindgen(method, indexing_getter)]
13 pub fn get(this: &ObjectExt, key: &str) -> JsValue;
14}
15
16impl ObjectExt {
17 pub fn new() -> Self {
18 Object::new().unchecked_into::<Self>()
19 }
20
21 pub fn get_string_unchecked<T: AsRef<str>>(&self, key: T) -> String {
22 self.get(key.as_ref()).as_string().unwrap()
23 }
24
25 pub fn get_string<T: AsRef<str>>(&self, key: T) -> Option<String> {
26 self.get(key.as_ref()).as_string()
27 }
28
29 pub fn get_f64_unchecked<T: AsRef<str>>(&self, key: T) -> f64 {
30 self.get(key.as_ref()).as_f64().unwrap()
31 }
32
33 pub fn get_f64<T: AsRef<str>>(&self, key: T) -> Option<f64> {
34 self.get(key.as_ref()).as_f64()
35 }
36
37 pub fn entries(&self) -> Vec<(String, JsValue)> {
38 Object::entries(self)
39 .iter()
40 .map(|pair| {
41 let pair = pair.unchecked_into::<js_sys::Array>();
42 (pair.get(0).as_string().unwrap(), pair.get(1))
43 })
44 .collect()
45 }
46
47 pub fn keys(&self) -> Vec<String> {
48 Object::keys(self)
49 .iter()
50 .map(|v| {
51 v.as_string().unwrap()
53 })
54 .collect()
55 }
56
57 pub fn values(&self) -> Vec<JsValue> {
58 Object::values(self).iter().collect()
59 }
60}
61
62impl Default for ObjectExt {
63 fn default() -> Self {
64 Self::new()
65 }
66}
67
68#[wasm_bindgen]
69extern "C" {
70 #[wasm_bindgen(js_namespace = console)]
71 pub fn log(v: &str);
72}