1 | use std::convert::TryInto; |
2 | |
3 | use super::*; |
4 | use crate::{bindgen_runtime::FromNapiValue, Env}; |
5 | |
6 | pub struct JsGlobal(pub(crate) Value); |
7 | |
8 | pub struct JsTimeout(pub(crate) Value); |
9 | |
10 | pub struct JSON(pub(crate) Value); |
11 | |
12 | impl FromNapiValue for JSON { |
13 | unsafe fn from_napi_value(env: sys::napi_env, napi_val: sys::napi_value) -> Result<Self> { |
14 | Ok(JSON(Value { |
15 | env, |
16 | value: napi_val, |
17 | value_type: ValueType::Object, |
18 | })) |
19 | } |
20 | } |
21 | |
22 | impl JSON { |
23 | pub fn stringify<V: NapiRaw>(&self, value: V) -> Result<std::string::String> { |
24 | let func: JsFunction = self.get_named_property_unchecked(name:"stringify" )?; |
25 | let result: JsString = func |
26 | .call(None, &[value]) |
27 | .map(|ret: JsUnknown| unsafe { ret.cast::<JsString>() })?; |
28 | result.into_utf8()?.as_str().map(|s: &str| s.to_owned()) |
29 | } |
30 | } |
31 | |
32 | impl JsGlobal { |
33 | pub fn set_interval(&self, handler: JsFunction, interval: f64) -> Result<JsTimeout> { |
34 | let func: JsFunction = self.get_named_property_unchecked("setInterval" )?; |
35 | func |
36 | .call( |
37 | None, |
38 | &[ |
39 | handler.into_unknown(), |
40 | unsafe { Env::from_raw(self.0.env) } |
41 | .create_double(interval)? |
42 | .into_unknown(), |
43 | ], |
44 | ) |
45 | .and_then(|ret| ret.try_into()) |
46 | } |
47 | |
48 | pub fn clear_interval(&self, timer: JsTimeout) -> Result<JsUndefined> { |
49 | let func: JsFunction = self.get_named_property_unchecked("clearInterval" )?; |
50 | func |
51 | .call(None, &[timer.into_unknown()]) |
52 | .and_then(|ret| ret.try_into()) |
53 | } |
54 | |
55 | pub fn set_timeout(&self, handler: JsFunction, interval: f64) -> Result<JsTimeout> { |
56 | let func: JsFunction = self.get_named_property_unchecked("setTimeout" )?; |
57 | func |
58 | .call( |
59 | None, |
60 | &[ |
61 | handler.into_unknown(), |
62 | unsafe { Env::from_raw(self.0.env) } |
63 | .create_double(interval)? |
64 | .into_unknown(), |
65 | ], |
66 | ) |
67 | .and_then(|ret| ret.try_into()) |
68 | } |
69 | |
70 | pub fn clear_timeout(&self, timer: JsTimeout) -> Result<JsUndefined> { |
71 | let func: JsFunction = self.get_named_property_unchecked("clearTimeout" )?; |
72 | func |
73 | .call(None, &[timer.into_unknown()]) |
74 | .and_then(|ret| ret.try_into()) |
75 | } |
76 | } |
77 | |