napi/js_values/
number.rs

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}