difftreelog
doc: builtin trait
in: master
1 file changed
crates/jrsonnet-evaluator/src/function/builtin.rsdiffbeforeafterboth1use 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}