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}