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!(r#"
11            class MyJsClass {
12                constructor(x, y) {
13                    this.x = x;
14                    this.y = y;
15                }
16                print() { console.log(this.x, this.y); }
17            } globalThis["MyJsClass"] = MyJsClass;
18        "#);
19    }
20    fn new(x: i32, y: i32) -> Self {
21        Self {
22            val: Val::global("MyJsClass").new(&argv![x, y])
23        }
24    }
25    fn print(&self) {
26        self.val.call("print", &[]);
27    }
28}
29
30impl FromVal for MyJsClass  {
31    fn from_val(v: &Val) -> Self {
32        MyJsClass {
33            val: v.clone(),
34        }
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 Into<Val> for MyJsClass {
59    fn into(self) -> Val {
60        Val::take_ownership(self.val.as_handle())
61    }
62}
63
64fn main() {
65    MyJsClass::define();
66    let c = MyJsClass::new(5, 6);
67    c.call("print", &[]);
68    let b = eval!(r#"
69        let b = new MyJsClass(6, 7);
70        b.print();
71        b
72    "#);
73    let a = b.as_::<MyJsClass>();
74    a.print();
75    let console = Console::get();
76    console.log(&[a.into()]);
77}