bind/
bind.rs

1use emlite::{env::Handle, *};
2use std::ops::{Deref, DerefMut};
3
4struct MyJsClass {
5    val: Val,
6}
7
8impl MyJsClass {
9    fn define() {
10        eval!(
11            r#"
12            class MyJsClass {
13                constructor(x, y) {
14                    this.x = x;
15                    this.y = y;
16                }
17                print() { console.log(this.x, this.y); }
18            } globalThis["MyJsClass"] = MyJsClass;
19        "#
20        );
21    }
22    fn new(x: i32, y: i32) -> Self {
23        Self {
24            val: Val::global("MyJsClass").new(&argv![x, y]),
25        }
26    }
27    fn print(&self) {
28        self.val.call("print", &[]);
29    }
30}
31
32impl FromVal for MyJsClass {
33    fn from_val(v: &Val) -> Self {
34        MyJsClass { val: v.clone() }
35    }
36    fn take_ownership(v: Handle) -> Self {
37        Self::from_val(&Val::take_ownership(v))
38    }
39    fn as_handle(&self) -> Handle {
40        self.val.as_handle()
41    }
42}
43
44impl Deref for MyJsClass {
45    type Target = Val;
46
47    fn deref(&self) -> &Self::Target {
48        &self.val
49    }
50}
51
52impl DerefMut for MyJsClass {
53    fn deref_mut(&mut self) -> &mut Self::Target {
54        &mut self.val
55    }
56}
57
58impl From<MyJsClass> for Val {
59    fn from(s: MyJsClass) -> Val {
60        let handle = s.as_handle();
61        std::mem::forget(s);
62        Val::take_ownership(handle)
63    }
64}
65
66fn main() {
67    MyJsClass::define();
68    let c = MyJsClass::new(5, 6);
69    c.call("print", &[]);
70    let b = eval!(
71        r#"
72        let b = new MyJsClass(6, 7);
73        b.print();
74        b
75    "#
76    );
77    let a = b.as_::<MyJsClass>();
78    a.print();
79    let console = Console::get();
80    console.log(&[a.into()]);
81}