rqjs_ext/modules/
exceptions.rs1use rquickjs::{
4 atom::PredefinedAtom,
5 function::{Constructor, Opt},
6 Class, Ctx, Object, Result,
7};
8
9#[rquickjs::class]
10#[derive(rquickjs::class::Trace)]
11pub struct DOMException {
12 message: String,
13 name: String,
14 stack: String,
15}
16
17#[rquickjs::methods]
18impl DOMException {
19 #[qjs(constructor)]
20 pub fn new(ctx: Ctx<'_>, message: Opt<String>, name: Opt<String>) -> Result<Self> {
21 let error_ctor: Constructor = ctx.globals().get(PredefinedAtom::Error)?;
22 let new: Object = error_ctor.construct((message.clone(),))?;
23
24 let message = message.0.unwrap_or(String::from(""));
25 let name = name.0.unwrap_or(String::from("Error"));
26
27 Ok(Self {
28 message,
29 name,
30 stack: new.get::<_, String>(PredefinedAtom::Stack)?,
31 })
32 }
33
34 #[qjs(get)]
35 fn message(&self) -> String {
36 self.message.clone()
37 }
38
39 #[qjs(get)]
40 fn name(&self) -> String {
41 self.name.clone()
42 }
43
44 #[qjs(get)]
45 fn stack(&self) -> String {
46 self.stack.clone()
47 }
48
49 #[qjs(rename = PredefinedAtom::ToString)]
50 pub fn to_string(&self) -> String {
51 if self.message.is_empty() {
52 return self.name.clone();
53 }
54
55 format!("{}: {}", &self.name, &self.message)
56 }
57}
58
59pub fn init(ctx: &Ctx<'_>) -> Result<()> {
60 let globals = ctx.globals();
61 Class::<DOMException>::define(&globals)?;
62
63 let dom_ex_proto = Class::<DOMException>::prototype(ctx.clone()).unwrap();
64 let error_ctor: Object = globals.get(PredefinedAtom::Error)?;
65 let error_proto = error_ctor.get_prototype();
66 dom_ex_proto.set_prototype(error_proto.as_ref())?;
67
68 Ok(())
69}