rqjs_ext/modules/
exceptions.rs

1// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2// SPDX-License-Identifier: Apache-2.0
3use 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}