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}