1#![allow(clippy::type_complexity)]23use crate::function::{parse_builtin_call, ArgsLike, Builtin, BuiltinParam, CallLocation};4use crate::gc::TraceBox;5use crate::Context;6use crate::{error::Result, Val};7use gcmodule::Trace;8use std::path::Path;9use std::rc::Rc;1011#[derive(Trace)]12pub struct NativeCallback {13 pub(crate) params: Vec<BuiltinParam>,14 handler: TraceBox<dyn NativeCallbackHandler>,15}16impl NativeCallback {17 #[deprecated = "prefer using builtins directly, use this interface only for bindings"]18 pub fn new(params: Vec<BuiltinParam>, handler: TraceBox<dyn NativeCallbackHandler>) -> Self {19 Self { params, handler }20 }21}2223impl Builtin for NativeCallback {24 fn name(&self) -> &str {25 26 27 "<native>"28 }2930 fn params(&self) -> &[BuiltinParam] {31 &self.params32 }3334 fn call(&self, context: Context, loc: CallLocation, args: &dyn ArgsLike) -> Result<Val> {35 let args = parse_builtin_call(context, &self.params, args, true)?;36 let mut out_args = Vec::with_capacity(self.params.len());37 for p in self.params.iter() {38 out_args.push(args[&p.name].evaluate()?);39 }40 self.handler.call(loc.0.map(|l| l.0.clone()), &out_args)41 }42}4344pub trait NativeCallbackHandler: Trace {45 fn call(&self, from: Option<Rc<Path>>, args: &[Val]) -> Result<Val>;46}