git.delta.rocks / jrsonnet / refs/commits / 112adb2810f2

difftreelog

source

crates/jrsonnet-evaluator/src/function/parse.rs1.2 KiBsourcehistory
1use std::rc::Rc;23use crate::{4	analyze::LFunction,5	evaluate::{destructure::destruct, evaluate},6	Context, ContextBuilder, Result, Thunk,7};89/// Creates Context with all argument default values applied10/// and with unbound values causing error to be returned.11pub fn parse_default_function_call(body_ctx: Context, func: &Rc<LFunction>) -> Result<Context> {12	let fctx = Context::new_future();13	let mut builder = ContextBuilder::extend(body_ctx, func.params.len());1415	for param in &func.params {16		if let Some(default_expr) = &param.default {17			let default_expr = default_expr.clone();18			let fctxc = fctx.clone();19			let thunk = Thunk!(move || {20				let ctx = fctxc.unwrap();21				evaluate(ctx, &default_expr)22			});23			destruct(&param.destruct, thunk, fctx.clone(), &mut builder);24		} else {25			let name = param.name.clone().unwrap_or_else(|| "<param>".into());26			let thunk = Thunk::errored(27				crate::error::ErrorKind::FunctionParameterNotBoundInCall(28					jrsonnet_ir::function::ParamName::Named(name),29					jrsonnet_ir::function::FunctionSignature::empty(),30				)31				.into(),32			);33			destruct(&param.destruct, thunk, fctx.clone(), &mut builder);34		}35	}3637	let ctx = builder.build().into_future(fctx);38	Ok(ctx)39}