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

difftreelog

feat(bindings) jpath api

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

1 file changed

modifiedbindings/jsonnet/src/lib.rsdiffbeforeafterboth
1use 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}
23
24#[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 self
60 }
61}
1362
14#[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}
1870
19// TODO71// TODO
167 todo!()219 todo!()
168}220}
221
222/// # Safety
223///
224/// This function is safe, if received v is a pointer to normal C string
169#[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_resolver
231 .as_any()
232 .downcast_ref::<NativeImportResolver>()
171 todo!()233 .unwrap();
234 resolver.add_jpath(path);
172}235}
173236
174/// # Safety237/// # Safety