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 #[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 #[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 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}