difftreelog
feat(bindings) jpath api
in: master
1 file changed
bindings/jsonnet/src/lib.rsdiffbeforeafterboth1use jrsonnet_evaluator::{EvaluationState, ObjValue, Val};1use jrsonnet_evaluator::{2 create_error, create_error_result, Error, EvaluationState, ImportResolver, LazyBinding,3 LazyVal, ObjMember, ObjValue, Result, Val,4};5use jrsonnet_parser::Visibility;2use libc::{c_char, c_double, c_int, c_uint};6use libc::{c_char, c_double, c_int, c_uint};3use std::{7use std::{8 alloc::Layout,9 any::Any,10 cell::RefCell,11 collections::BTreeMap,4 ffi::{CStr, CString},12 ffi::{CStr, CString},13 fs::File,14 io::Read,5 path::PathBuf,15 path::PathBuf,6 rc::Rc,16 rc::Rc,7};17};11 b"v0.16.0\0"21 b"v0.16.0\0"12}22}2324#[derive(Default)]25struct NativeImportResolver {26 library_paths: RefCell<Vec<PathBuf>>,27}28impl NativeImportResolver {29 fn add_jpath(&self, path: PathBuf) {30 self.library_paths.borrow_mut().push(path);31 }32}33impl ImportResolver for NativeImportResolver {34 fn resolve_file(&self, from: &PathBuf, path: &PathBuf) -> Result<Rc<PathBuf>> {35 let mut new_path = from.clone();36 new_path.push(path);37 if new_path.exists() {38 Ok(Rc::new(new_path))39 } else {40 for library_path in self.library_paths.borrow().iter() {41 let mut cloned = library_path.clone();42 cloned.push(path);43 if cloned.exists() {44 return Ok(Rc::new(cloned));45 }46 }47 create_error_result(Error::ImportFileNotFound(from.clone(), path.clone()))48 }49 }50 fn load_file_contents(&self, id: &PathBuf) -> Result<Rc<str>> {51 let mut file =52 File::open(id).map_err(|_e| create_error(Error::ResolvedFileNotFound(id.clone())))?;53 let mut out = String::new();54 file.read_to_string(&mut out)55 .map_err(|_e| create_error(Error::ImportBadFileUtf8(id.clone())))?;56 Ok(out.into())57 }58 unsafe fn as_any(&self) -> &dyn Any {59 self60 }61}136214#[no_mangle]63#[no_mangle]15pub extern "C" fn jsonnet_make() -> Box<EvaluationState> {64pub extern "C" fn jsonnet_make() -> Box<EvaluationState> {65 let state = EvaluationState::default();66 state.with_stdlib();16 Box::new(EvaluationState::default())67 state.set_import_resolver(Box::new(NativeImportResolver::default()));68 Box::new(state)17}69}187019// TODO71// TODO167 todo!()219 todo!()168}220}221222/// # Safety223///224/// This function is safe, if received v is a pointer to normal C string169#[no_mangle]225#[no_mangle]170pub extern "C" fn jsonnet_jpath_add() {226pub unsafe extern "C" fn jsonnet_jpath_add(vm: &EvaluationState, v: *const c_char) {227 let cstr = CStr::from_ptr(v);228 let path = PathBuf::from(cstr.to_str().unwrap());229 let any_resolver = vm.import_resolver();230 let resolver = any_resolver231 .as_any()232 .downcast_ref::<NativeImportResolver>()171 todo!()233 .unwrap();234 resolver.add_jpath(path);172}235}173236174/// # Safety237/// # Safety