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

difftreelog

feat TLA support

Лач2020-06-10parent: #d581de0.patch.diff
in: master

2 files changed

modifiedcmds/jrsonnet/src/main.rsdiffbeforeafterboth
--- a/cmds/jrsonnet/src/main.rs
+++ b/cmds/jrsonnet/src/main.rs
@@ -2,9 +2,10 @@
 
 use clap::Clap;
 use jsonnet_evaluator::{EvaluationSettings, EvaluationState, LocError, StackTrace, Val};
+use jsonnet_parser::{el, Arg, ArgsDesc, Expr, LocExpr, ParserSettings};
 use location::{offset_to_location, CodeLocation};
 use std::env::current_dir;
-use std::{path::PathBuf, str::FromStr};
+use std::{collections::HashMap, path::PathBuf, str::FromStr};
 
 enum Format {
 	None,
@@ -134,6 +135,36 @@
 	let result = evaluator.evaluate_file(&input);
 	match result {
 		Ok(v) => {
+			let v = match v {
+				Val::Func(f) => {
+					let mut desc_map = HashMap::new();
+					for ExtStr { name, value } in opts.tla_str.iter().cloned() {
+						desc_map.insert(name, el!(Expr::Str(value)));
+					}
+					for ExtStr { name, value } in opts.tla_code.iter().cloned() {
+						desc_map.insert(
+							name,
+							jsonnet_parser::parse(
+								&value,
+								&ParserSettings {
+									file_name: PathBuf::new(),
+									loc_data: false,
+								},
+							)
+							.unwrap(),
+						);
+					}
+					evaluator.add_global("__tmp__tlf__".to_owned(), Val::Func(f));
+					evaluator
+						.evaluate_raw(el!(Expr::Apply(
+							el!(Expr::Var("__tmp__tlf__".to_owned())),
+							ArgsDesc(desc_map.into_iter().map(|(k, v)| Arg(Some(k), v)).collect()),
+							false,
+						)))
+						.unwrap()
+				}
+				v => v,
+			};
 			let v = match opts.format {
 				Format::Json => {
 					if opts.no_stdlib {
modifiedcrates/jsonnet-evaluator/src/lib.rsdiffbeforeafterboth
191 file_name: PathBuf::from("raw.jsonnet"),191 file_name: PathBuf::from("raw.jsonnet"),
192 loc_data: true,192 loc_data: true,
193 },193 },
194 );194 )
195 self.begin_state();195 .unwrap();
196 let value = evaluate(self.create_default_context()?, &parsed.unwrap());
197 self.end_state();196 self.evaluate_raw(parsed)
198 value
199 }197 }
198
199 pub fn evaluate_raw(&self, code: LocExpr) -> Result<Val> {
200 self.begin_state();
201 let value = evaluate(self.create_default_context()?, &code);
202 self.end_state();
203 value
204 }
200205
201 pub fn add_global(&self, name: String, value: Val) {206 pub fn add_global(&self, name: String, value: Val) {
202 self.0.globals.borrow_mut().insert(name, value);207 self.0.globals.borrow_mut().insert(name, value);