quickjs_rusty/value/
function.rs1use std::fmt::Debug;
2use std::ops::Deref;
3
4use libquickjs_ng_sys as q;
5
6use crate::{ExecutionError, ValueError};
7
8use super::OwnedJsValue;
9
10#[derive(Clone, Debug, PartialEq)]
13pub struct JsFunction {
14 value: OwnedJsValue,
15}
16
17impl JsFunction {
18 pub fn try_from_value(value: OwnedJsValue) -> Result<Self, ValueError> {
19 if !value.is_function() {
20 Err(ValueError::Internal(format!(
21 "Expected a function, got {:?}",
22 value.tag()
23 )))
24 } else {
25 Ok(Self { value })
26 }
27 }
28
29 pub fn into_value(self) -> OwnedJsValue {
30 self.value
31 }
32
33 pub fn call(&self, args: Vec<OwnedJsValue>) -> Result<OwnedJsValue, ExecutionError> {
34 let mut qargs = args.iter().map(|arg| arg.value).collect::<Vec<_>>();
35
36 let qres_raw = unsafe {
37 q::JS_Call(
38 self.value.context(),
39 self.value.value,
40 q::JS_Ext_NewSpecialValue(q::JS_TAG_NULL, 0),
41 qargs.len() as i32,
42 qargs.as_mut_ptr(),
43 )
44 };
45 Ok(OwnedJsValue::new(self.value.context(), qres_raw))
46 }
47}
48
49impl Deref for JsFunction {
50 type Target = OwnedJsValue;
51
52 fn deref(&self) -> &Self::Target {
53 &self.value
54 }
55}