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
--- a/bindings/jsonnet/src/lib.rs
+++ b/bindings/jsonnet/src/lib.rs
@@ -306,10 +306,42 @@
 		}
 	})
 }
+
+/// # Safety
+///
+/// This function is safe, if received v is a pointer to normal C string
 #[no_mangle]
-pub extern "C" fn jsonnet_evaluate_snippet() {
-	todo!()
+pub unsafe extern "C" fn jsonnet_evaluate_snippet(
+	vm: &EvaluationState,
+	filename: *const c_char,
+	snippet: *const c_char,
+	error: &mut c_int,
+) -> *const c_char {
+	vm.run_in_state(|| {
+		use std::fmt::Write;
+		let filename = CStr::from_ptr(filename);
+		let snippet = CStr::from_ptr(snippet);
+		match vm.evaluate_snippet_to_json(
+			&PathBuf::from(filename.to_str().unwrap()),
+			&snippet.to_str().unwrap(),
+		) {
+			Ok(v) => {
+				*error = 0;
+				CString::new(&*v as &str).unwrap().into_raw()
+			}
+			Err(e) => {
+				*error = 1;
+				let mut out = String::new();
+				writeln!(out, "{:?}", e.0).unwrap();
+				for i in (e.1).0.iter() {
+					writeln!(out, "{:?} ---- {}", i.0, i.1).unwrap();
+				}
+				CString::new(&out as &str).unwrap().into_raw()
+			}
+		}
+	})
 }
+
 #[no_mangle]
 pub extern "C" fn jsonnet_evaluate_file_multi() {
 	todo!()
modifiedcrates/jrsonnet-evaluator/src/lib.rsdiffbeforeafterboth
140 ) -> std::result::Result<Rc<str>, LocError> {140 ) -> std::result::Result<Rc<str>, LocError> {
141 self.import_file(&PathBuf::new(), &path).and_then(|v|v.into_json(4))141 self.import_file(&PathBuf::new(), &path).and_then(|v|v.into_json(4))
142 }142 }
143 pub fn evaluate_snippet_to_json(
144 &self,
145 path: &PathBuf,
146 snippet: &str,
147 ) -> std::result::Result<Rc<str>, LocError> {
148 self.parse_evaluate_raw_with_source(Rc::new(path.clone()), snippet).and_then(|v|v.into_json(4))
149 }
150
143 pub fn add_file(151 pub fn add_file(
144 &self,152 &self,
228 Ok(self.data().str_files.get(&path).cloned().unwrap())236 Ok(self.data().str_files.get(&path).cloned().unwrap())
229 }237 }
230238
231 pub fn parse_evaluate_raw(&self, code: &str) -> Result<Val> {239 pub fn parse_evaluate_raw_with_source(&self, source: Rc<PathBuf>, code: &str) -> Result<Val> {
232 let parsed = parse(240 let parsed = parse(
233 &code,241 &code,
234 &ParserSettings {242 &ParserSettings {
235 file_name: Rc::new(PathBuf::from("raw.jsonnet")),243 file_name: source,
236 loc_data: true,244 loc_data: true,
237 },245 },
238 )246 )
239 .unwrap();247 .unwrap();
240 self.evaluate_raw(parsed)248 self.evaluate_raw(parsed)
241 }249 }
250 pub fn parse_evaluate_raw(&self, code: &str) -> Result<Val> {
251 self.parse_evaluate_raw_with_source(Rc::new(PathBuf::from("raw.jsonnet")), code)
252 }
242253
243 pub fn evaluate_raw(&self, code: LocExpr) -> Result<Val> {254 pub fn evaluate_raw(&self, code: LocExpr) -> Result<Val> {
244 self.run_in_state(|| evaluate(self.create_default_context()?, &code))255 self.run_in_state(|| evaluate(self.create_default_context()?, &code))