git.delta.rocks / jrsonnet / refs/commits / efea8379ff42

difftreelog

source

crates/jrsonnet-evaluator/src/native.rs1.4 KiBsourcehistory
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		// TODO: standard natives gets their names from definition27		// But builitins should already have them28		"<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}