git.delta.rocks / jrsonnet / refs/commits / 1178a0b35409

difftreelog

doc: builtin trait

Yaroslav Bolyukin2022-10-11parent: #420d09a.patch.diff
in: master

1 file changed

modifiedcrates/jrsonnet-evaluator/src/function/builtin.rsdiffbeforeafterboth
after · crates/jrsonnet-evaluator/src/function/builtin.rs
1use std::borrow::Cow;23use jrsonnet_gcmodule::Trace;45use super::{arglike::ArgsLike, parse::parse_builtin_call, CallLocation};6use crate::{error::Result, gc::TraceBox, Context, State, Val};78pub type BuiltinParamName = Cow<'static, str>;910#[derive(Clone, Trace)]11pub struct BuiltinParam {12	pub name: BuiltinParamName,13	pub has_default: bool,14}1516/// Description of function defined by native code17///18/// Prefer to use #[builtin] macro, instead of manual implementation of this trait19pub trait Builtin: Trace {20	/// Function name to be used in stack traces21	fn name(&self) -> &str;22	/// Parameter names for named calls23	fn params(&self) -> &[BuiltinParam];24	/// Call the builtin25	fn call(&self, s: State, ctx: Context, loc: CallLocation, args: &dyn ArgsLike) -> Result<Val>;26}2728pub trait StaticBuiltin: Builtin + Send + Sync29where30	Self: 'static,31{32	// In impl, to make it object safe:33	// const INST: &'static Self;34}3536#[derive(Trace)]37pub struct NativeCallback {38	pub(crate) params: Vec<BuiltinParam>,39	handler: TraceBox<dyn NativeCallbackHandler>,40}41impl NativeCallback {42	#[deprecated = "prefer using builtins directly, use this interface only for bindings"]43	pub fn new(params: Vec<BuiltinParam>, handler: TraceBox<dyn NativeCallbackHandler>) -> Self {44		Self { params, handler }45	}46}4748impl Builtin for NativeCallback {49	fn name(&self) -> &str {50		// TODO: standard natives gets their names from definition51		// But builitins should already have them52		"<native>"53	}5455	fn params(&self) -> &[BuiltinParam] {56		&self.params57	}5859	fn call(&self, s: State, ctx: Context, _loc: CallLocation, args: &dyn ArgsLike) -> Result<Val> {60		let args = parse_builtin_call(s.clone(), ctx, &self.params, args, true)?;61		let mut out_args = Vec::with_capacity(self.params.len());62		for p in &self.params {63			out_args.push(args[&p.name].evaluate(s.clone())?);64		}65		self.handler.call(s, &out_args)66	}67}6869pub trait NativeCallbackHandler: Trace {70	fn call(&self, s: State, args: &[Val]) -> Result<Val>;71}