quickjs_rusty/value/
function.rs

1use 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/// Wraps an object from the QuickJs runtime.
11/// Provides convenience property accessors.
12#[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}