1use super::{check_status, sys};
2use crate::{bindgen_prelude::ToNapiValue, type_of, Error, Result};
3
4macro_rules! impl_number_conversions {
5 ( $( ($name:literal, $t:ty as $st:ty, $get:ident, $create:ident) ,)* ) => {
6 $(
7 impl $crate::bindgen_prelude::TypeName for $t {
8 fn type_name() -> &'static str {
9 $name
10 }
11
12 fn value_type() -> crate::ValueType {
13 crate::ValueType::Number
14 }
15 }
16
17 impl $crate::bindgen_prelude::ValidateNapiValue for $t { }
18
19 impl ToNapiValue for $t {
20 unsafe fn to_napi_value(env: $crate::sys::napi_env, val: $t) -> Result<$crate::sys::napi_value> {
21 let mut ptr = std::ptr::null_mut();
22 let val: $st = val.into();
23
24 check_status!(
25 unsafe { sys::$create(env, val, &mut ptr) },
26 "Failed to convert rust type `{}` into napi value",
27 $name,
28 )?;
29
30 Ok(ptr)
31 }
32 }
33
34 impl $crate::bindgen_prelude::FromNapiValue for $t {
35 unsafe fn from_napi_value(env: $crate::sys::napi_env, napi_val: $crate::sys::napi_value) -> Result<Self> {
36 let mut ret = 0 as $st;
37
38 check_status!(
39 unsafe { sys::$get(env, napi_val, &mut ret) },
40 "Failed to convert napi value {:?} into rust type `{}`",
41 type_of!(env, napi_val)?,
42 $name,
43 )?;
44
45 ret.try_into().map_err(|_| Error::from_reason(concat!("Failed to convert ", stringify!($st), " to ", stringify!($t))))
46 }
47 }
48 )*
49 };
50}
51
52impl_number_conversions!(
53 ("u8", u8 as u32, napi_get_value_uint32, napi_create_uint32),
54 ("i8", i8 as i32, napi_get_value_int32, napi_create_int32),
55 ("u16", u16 as u32, napi_get_value_uint32, napi_create_uint32),
56 ("i16", i16 as i32, napi_get_value_int32, napi_create_int32),
57 ("u32", u32 as u32, napi_get_value_uint32, napi_create_uint32),
58 ("i32", i32 as i32, napi_get_value_int32, napi_create_int32),
59 ("i64", i64 as i64, napi_get_value_int64, napi_create_int64),
60 ("f64", f64 as f64, napi_get_value_double, napi_create_double),
61);
62
63impl ToNapiValue for f32 {
64 unsafe fn to_napi_value(env: crate::sys::napi_env, val: f32) -> Result<crate::sys::napi_value> {
65 let mut ptr: *mut napi_value__ = std::ptr::null_mut();
66
67 check_status!(
68 unsafe { sys::napi_create_double(env, val.into(), &mut ptr) },
69 "Failed to convert rust type `f32` into napi value",
70 )?;
71
72 Ok(ptr)
73 }
74}
75