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}