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

difftreelog

feat(bindings) snippet evaluation

Лач2020-06-28parent: #b41226a.patch.diff
in: master

2 files changed

modifiedbindings/jsonnet/src/lib.rsdiffbeforeafterboth
307 })307 })
308}308}
309
310/// # Safety
311///
312/// This function is safe, if received v is a pointer to normal C string
309#[no_mangle]313#[no_mangle]
310pub extern "C" fn jsonnet_evaluate_snippet() {314pub unsafe extern "C" fn jsonnet_evaluate_snippet(
315 vm: &EvaluationState,
316 filename: *const c_char,
317 snippet: *const c_char,
318 error: &mut c_int,
319) -> *const c_char {
320 vm.run_in_state(|| {
321 use std::fmt::Write;
322 let filename = CStr::from_ptr(filename);
323 let snippet = CStr::from_ptr(snippet);
324 match vm.evaluate_snippet_to_json(
325 &PathBuf::from(filename.to_str().unwrap()),
326 &snippet.to_str().unwrap(),
327 ) {
328 Ok(v) => {
329 *error = 0;
330 CString::new(&*v as &str).unwrap().into_raw()
331 }
332 Err(e) => {
333 *error = 1;
334 let mut out = String::new();
311 todo!()335 writeln!(out, "{:?}", e.0).unwrap();
336 for i in (e.1).0.iter() {
337 writeln!(out, "{:?} ---- {}", i.0, i.1).unwrap();
338 }
339 CString::new(&out as &str).unwrap().into_raw()
340 }
312}341 }
342 })
343}
344
313#[no_mangle]345#[no_mangle]
314pub extern "C" fn jsonnet_evaluate_file_multi() {346pub extern "C" fn jsonnet_evaluate_file_multi() {
modifiedcrates/jrsonnet-evaluator/src/lib.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/lib.rs
+++ b/crates/jrsonnet-evaluator/src/lib.rs
@@ -140,6 +140,14 @@
 	) -> std::result::Result<Rc<str>, LocError> {
 		self.import_file(&PathBuf::new(), &path).and_then(|v|v.into_json(4))
 	}
+	pub fn evaluate_snippet_to_json(
+		&self,
+		path: &PathBuf,
+		snippet: &str,
+	) -> std::result::Result<Rc<str>, LocError> {
+		self.parse_evaluate_raw_with_source(Rc::new(path.clone()), snippet).and_then(|v|v.into_json(4))
+	}
+
 	pub fn add_file(
 		&self,
 		name: Rc<PathBuf>,
@@ -228,17 +236,20 @@
 		Ok(self.data().str_files.get(&path).cloned().unwrap())
 	}
 
-	pub fn parse_evaluate_raw(&self, code: &str) -> Result<Val> {
+	pub fn parse_evaluate_raw_with_source(&self, source: Rc<PathBuf>, code: &str) -> Result<Val> {
 		let parsed = parse(
 			&code,
 			&ParserSettings {
-				file_name: Rc::new(PathBuf::from("raw.jsonnet")),
+				file_name: source,
 				loc_data: true,
 			},
 		)
 		.unwrap();
 		self.evaluate_raw(parsed)
 	}
+	pub fn parse_evaluate_raw(&self, code: &str) -> Result<Val> {
+		self.parse_evaluate_raw_with_source(Rc::new(PathBuf::from("raw.jsonnet")), code)
+	}
 
 	pub fn evaluate_raw(&self, code: LocExpr) -> Result<Val> {
 		self.run_in_state(|| evaluate(self.create_default_context()?, &code))