nodex_api/value/
error.rs

1use crate::{api, prelude::*};
2use std::ffi::CString;
3
4#[derive(Copy, Clone, Debug)]
5pub struct JsError(pub(crate) JsValue);
6
7impl JsError {
8    pub(crate) fn from_value(value: JsValue) -> JsError {
9        JsError(value)
10    }
11
12    /// Return Error
13    #[inline]
14    pub fn error(
15        env: NapiEnv,
16        msg: impl AsRef<str>,
17        code: Option<impl AsRef<str>>,
18    ) -> NapiResult<JsError> {
19        let code = if let Some(code) = code {
20            env.string(code.as_ref())?.raw()
21        } else {
22            std::ptr::null_mut()
23        };
24        let msg = env.string(msg.as_ref())?;
25        let err = napi_call!(=napi_create_error, env, code, msg.raw());
26        Ok(JsError(JsValue(env, err)))
27    }
28
29    /// Return TypeError
30    #[inline]
31    pub fn type_error(
32        env: NapiEnv,
33        msg: impl NapiValueT,
34        code: Option<impl NapiValueT>,
35    ) -> NapiResult<JsError> {
36        let code = if let Some(code) = code {
37            code.value().raw()
38        } else {
39            std::ptr::null_mut()
40        };
41        let err = napi_call!(=napi_create_type_error, env, code, msg.value().raw());
42        Ok(JsError(JsValue(env, err)))
43    }
44
45    /// Return RangeError
46    pub fn range_error(
47        env: NapiEnv,
48        msg: impl NapiValueT,
49        code: Option<impl NapiValueT>,
50    ) -> NapiResult<JsError> {
51        let code = if let Some(code) = code {
52            code.value().raw()
53        } else {
54            std::ptr::null_mut()
55        };
56        let err = napi_call!(=napi_create_range_error, env, code, msg.value().raw());
57        Ok(JsError(JsValue(env, err)))
58    }
59}
60
61napi_value_t!(JsError);
62
63impl NapiValueCheck for JsError {
64    fn check(&self) -> NapiResult<bool> {
65        Ok(napi_call!(=napi_is_error, self.env(), self.raw()))
66    }
67}