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