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}