git.delta.rocks / jrsonnet / refs/commits / 9c0fa0107dd8

difftreelog

source

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