napi/js_values/
date.rs

1use std::marker::PhantomData;
2use std::ptr;
3
4use crate::{
5  bindgen_runtime::{FromNapiValue, JsObjectValue, TypeName, ValidateNapiValue},
6  check_status, sys, Error, JsValue, Result, Status, Value, ValueType,
7};
8
9#[derive(Clone, Copy)]
10pub struct JsDate<'env>(pub(crate) Value, pub(crate) PhantomData<&'env ()>);
11
12impl TypeName for JsDate<'_> {
13  fn type_name() -> &'static str {
14    "Date"
15  }
16
17  fn value_type() -> crate::ValueType {
18    ValueType::Object
19  }
20}
21
22impl ValidateNapiValue for JsDate<'_> {
23  unsafe fn validate(env: sys::napi_env, napi_val: sys::napi_value) -> Result<sys::napi_value> {
24    let mut is_date = false;
25    check_status!(unsafe { sys::napi_is_date(env, napi_val, &mut is_date) })?;
26    if !is_date {
27      return Err(Error::new(
28        Status::InvalidArg,
29        "Expected a Date object".to_owned(),
30      ));
31    }
32
33    Ok(ptr::null_mut())
34  }
35}
36
37impl FromNapiValue for JsDate<'_> {
38  unsafe fn from_napi_value(env: sys::napi_env, napi_val: sys::napi_value) -> Result<Self> {
39    Ok(Self(
40      Value {
41        env,
42        value: napi_val,
43        value_type: ValueType::Object,
44      },
45      PhantomData,
46    ))
47  }
48}
49
50impl<'env> JsValue<'env> for JsDate<'env> {
51  fn value(&self) -> Value {
52    self.0
53  }
54}
55
56impl<'env> JsObjectValue<'env> for JsDate<'env> {}
57
58impl JsDate<'_> {
59  pub(crate) fn from_raw(env: sys::napi_env, value: sys::napi_value) -> Self {
60    Self(
61      Value {
62        env,
63        value,
64        value_type: ValueType::Object,
65      },
66      PhantomData,
67    )
68  }
69
70  pub fn value_of(&self) -> Result<f64> {
71    let mut timestamp: f64 = 0.0;
72    check_status!(unsafe { sys::napi_get_date_value(self.0.env, self.0.value, &mut timestamp) })?;
73    Ok(timestamp)
74  }
75}