1use std::convert::TryFrom;
2
3use crate::{
4 bindgen_runtime::{FromNapiValue, TypeName, ValidateNapiValue},
5 check_status, sys, Error, JsValue, Result, Value, ValueType,
6};
7
8#[derive(Clone, Copy)]
9pub struct JsNumber<'env>(
10 pub(crate) Value,
11 pub(crate) std::marker::PhantomData<&'env ()>,
12);
13
14impl TypeName for JsNumber<'_> {
15 fn type_name() -> &'static str {
16 "number"
17 }
18
19 fn value_type() -> crate::ValueType {
20 ValueType::Number
21 }
22}
23
24impl ValidateNapiValue for JsNumber<'_> {}
25
26impl<'env> JsValue<'env> for JsNumber<'env> {
27 fn value(&self) -> Value {
28 self.0
29 }
30}
31
32impl FromNapiValue for JsNumber<'_> {
33 unsafe fn from_napi_value(env: sys::napi_env, napi_val: sys::napi_value) -> Result<Self> {
34 Ok(JsNumber(
35 Value {
36 env,
37 value: napi_val,
38 value_type: ValueType::Number,
39 },
40 std::marker::PhantomData,
41 ))
42 }
43}
44
45impl JsNumber<'_> {
46 pub fn get_uint32(&self) -> Result<u32> {
47 let mut result = 0;
48 check_status!(unsafe { sys::napi_get_value_uint32(self.0.env, self.0.value, &mut result) })?;
49 Ok(result)
50 }
51
52 pub fn get_int32(&self) -> Result<i32> {
53 let mut result = 0;
54 check_status!(unsafe { sys::napi_get_value_int32(self.0.env, self.0.value, &mut result) })?;
55 Ok(result)
56 }
57
58 pub fn get_int64(&self) -> Result<i64> {
59 let mut result = 0;
60 check_status!(unsafe { sys::napi_get_value_int64(self.0.env, self.0.value, &mut result) })?;
61 Ok(result)
62 }
63
64 pub fn get_double(&self) -> Result<f64> {
65 let mut result = 0_f64;
66 check_status!(unsafe { sys::napi_get_value_double(self.0.env, self.0.value, &mut result) })?;
67 Ok(result)
68 }
69}
70
71impl TryFrom<JsNumber<'_>> for u32 {
72 type Error = Error;
73
74 fn try_from(value: JsNumber) -> Result<u32> {
75 let mut result = 0;
76 check_status!(unsafe { sys::napi_get_value_uint32(value.0.env, value.0.value, &mut result) })?;
77 Ok(result)
78 }
79}
80
81impl TryFrom<JsNumber<'_>> for i32 {
82 type Error = Error;
83
84 fn try_from(value: JsNumber) -> Result<i32> {
85 let mut result = 0;
86 check_status!(unsafe { sys::napi_get_value_int32(value.0.env, value.0.value, &mut result) })?;
87 Ok(result)
88 }
89}
90
91impl TryFrom<JsNumber<'_>> for i64 {
92 type Error = Error;
93
94 fn try_from(value: JsNumber) -> Result<i64> {
95 let mut result = 0;
96 check_status!(unsafe { sys::napi_get_value_int64(value.0.env, value.0.value, &mut result) })?;
97 Ok(result)
98 }
99}
100
101impl TryFrom<JsNumber<'_>> for f64 {
102 type Error = Error;
103
104 fn try_from(value: JsNumber) -> Result<f64> {
105 let mut result = 0_f64;
106 check_status!(unsafe { sys::napi_get_value_double(value.0.env, value.0.value, &mut result) })?;
107 Ok(result)
108 }
109}