difftreelog
feat(bindings) snippet evaluation
in: master
2 files changed
bindings/jsonnet/src/lib.rsdiffbeforeafterboth307 })307 })308}308}309310/// # Safety311///312/// This function is safe, if received v is a pointer to normal C string309#[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}344313#[no_mangle]345#[no_mangle]314pub extern "C" fn jsonnet_evaluate_file_multi() {346pub extern "C" fn jsonnet_evaluate_file_multi() {crates/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))