nodex_api/value/
number.rs

1use crate::{api, prelude::*};
2use std::{mem::MaybeUninit, os::raw::c_char};
3
4#[derive(Copy, Clone, Debug)]
5pub struct JsNumber(pub(crate) JsValue);
6
7impl JsNumber {
8    pub(crate) fn from_value(value: JsValue) -> JsNumber {
9        JsNumber(value)
10    }
11
12    /// This API is used to convert from the C int32_t type to the JavaScript number type.
13    /// The JavaScript number type is described in Section 6.1.6 of the ECMAScript Language Specification.
14    pub fn int32(env: NapiEnv, value: i32) -> NapiResult<JsNumber> {
15        let value = napi_call!(
16            =napi_create_int32,
17            env,
18            value,
19        );
20
21        Ok(JsNumber(JsValue::from_raw(env, value)))
22    }
23
24    /// This API is used to convert from the C uint32_t type to the JavaScript number type.
25    /// The JavaScript number type is described in Section 6.1.6 of the ECMAScript Language Specification.
26    pub fn uint32(env: NapiEnv, value: u32) -> NapiResult<JsNumber> {
27        let value = napi_call!(
28            =napi_create_uint32,
29            env,
30            value,
31        );
32
33        Ok(JsNumber(JsValue::from_raw(env, value)))
34    }
35
36    /// This API is used to convert from the C int64_t type to the JavaScript number type.
37    /// The JavaScript number type is described in Section 6.1.6 of the ECMAScript Language Specification. Note the complete range of int64_t cannot be represented with full precision in JavaScript. Integer values outside the range of Number.MIN_SAFE_INTEGER -(2**53 - 1) - Number.MAX_SAFE_INTEGER (2**53 - 1) will lose precision.
38    pub fn int64(env: NapiEnv, value: i64) -> NapiResult<JsNumber> {
39        let value = napi_call!(
40            =napi_create_int64,
41            env,
42            value,
43        );
44
45        Ok(JsNumber(JsValue::from_raw(env, value)))
46    }
47
48    /// This API is used to convert from the C double type to the JavaScript number type.
49    /// The JavaScript number type is described in Section 6.1.6 of the ECMAScript Language Specification.
50    pub fn double(env: NapiEnv, value: f64) -> NapiResult<JsNumber> {
51        let value = napi_call!(
52            =napi_create_double,
53            env,
54            value,
55        );
56
57        Ok(JsNumber(JsValue::from_raw(env, value)))
58    }
59
60    /// If a non-number napi_value is passed in napi_number_expected.
61    /// This API returns the C int32 primitive equivalent of the given JavaScript number.
62    /// If the number exceeds the range of the 32 bit integer, then the result is truncated to the equivalent of the bottom 32 bits. This can result in a large positive number becoming a negative number if the value is > 231 - 1.
63    /// Non-finite number values (NaN, +Infinity, or -Infinity) set the result to zero.
64    pub fn get_value_int32(&self) -> NapiResult<i32> {
65        Ok(napi_call!(=napi_get_value_int32, self.env(), self.raw()))
66    }
67
68    /// If a non-number napi_value is passed in it returns napi_number_expected.
69    /// This API returns the C primitive equivalent of the given napi_value as a uint32_t.
70    pub fn get_value_uint32(&self) -> NapiResult<u32> {
71        Ok(napi_call!(=napi_get_value_uint32, self.env(), self.raw()))
72    }
73
74    /// If a non-number napi_value is passed in it returns napi_number_expected.
75    /// This API returns the C int64 primitive equivalent of the given JavaScript number.
76    /// number values outside the range of Number.MIN_SAFE_INTEGER -(2**53 - 1) - Number.MAX_SAFE_INTEGER (2**53 - 1) will lose precision.
77    /// Non-finite number values (NaN, +Infinity, or -Infinity) set the result to zero.
78    pub fn get_value_int64(&self) -> NapiResult<i64> {
79        Ok(napi_call!(=napi_get_value_int64, self.env(), self.raw()))
80    }
81
82    /// If a non-number napi_value is passed in it returns napi_number_expected.
83    /// This API returns the C double primitive equivalent of the given JavaScript number.
84    pub fn get_value_double(&self) -> NapiResult<f64> {
85        Ok(napi_call!(=napi_get_value_double, self.env(), self.raw()))
86    }
87}
88
89napi_value_t!(JsNumber);
90
91impl NapiValueCheck for JsNumber {
92    fn check(&self) -> NapiResult<bool> {
93        Ok(self.kind()? == NapiValuetype::Number)
94    }
95}