1use jrsonnet_evaluator::{EvaluationState, ObjValue, Val};2use libc::{c_char, c_double, c_int, c_uint};3use std::{4 ffi::{CStr, CString},5 path::PathBuf,6 rc::Rc,7};89#[no_mangle]10pub extern "C" fn jsonnet_version() -> &'static [u8; 8] {11 b"v0.16.0\0"12}1314#[no_mangle]15pub extern "C" fn jsonnet_make() -> Box<EvaluationState> {16 Box::new(EvaluationState::default())17}181920#[no_mangle]21pub extern "C" fn jsonnet_max_stack(_vm: &EvaluationState, _v: c_uint) {}222324#[no_mangle]25pub extern "C" fn jsonnet_gc_min_objects(_vm: &EvaluationState, _v: c_uint) {}26#[no_mangle]27pub extern "C" fn jsonnet_gc_growth_trigger(_vm: &EvaluationState, _v: c_double) {}282930#[no_mangle]31pub extern "C" fn jsonnet_string_output(_vm: &EvaluationState, _v: c_int) {}3233#[no_mangle]34pub extern "C" fn jsonnet_json_extract_string(_vm: &EvaluationState, v: &Val) -> *mut c_char {35 match v.unwrap_if_lazy().unwrap() {36 Val::Str(s) => CString::new(&*s as &str).unwrap().into_raw(),37 _ => std::ptr::null_mut(),38 }39}40#[no_mangle]41pub extern "C" fn jsonnet_json_extract_number(42 _vm: &EvaluationState,43 v: &Val,44 out: &mut c_double,45) -> c_int {46 match v.unwrap_if_lazy().unwrap() {47 Val::Num(n) => {48 *out = n;49 150 }51 _ => 0,52 }53}54#[no_mangle]55pub extern "C" fn jsonnet_json_extract_bool(_vm: &EvaluationState, v: &Val) -> c_int {56 match v.unwrap_if_lazy().unwrap() {57 Val::Bool(false) => 0,58 Val::Bool(true) => 1,59 _ => 2,60 }61}62#[no_mangle]63pub extern "C" fn jsonnet_json_extract_null(_vm: &EvaluationState, v: &Val) -> c_int {64 match v.unwrap_if_lazy().unwrap() {65 Val::Null => 1,66 _ => 0,67 }68}6970717273#[no_mangle]74pub unsafe extern "C" fn jsonnet_json_make_string(75 _vm: &EvaluationState,76 v: *const c_char,77) -> Box<Val> {78 let cstr = CStr::from_ptr(v);79 let str = cstr.to_str().unwrap();80 Box::new(Val::Str(str.into()))81}8283#[no_mangle]84pub extern "C" fn jsonnet_json_make_number(_vm: &EvaluationState, v: c_double) -> Box<Val> {85 Box::new(Val::Num(v))86}8788#[no_mangle]89pub extern "C" fn jsonnet_json_make_bool(_vm: &EvaluationState, v: c_int) -> Box<Val> {90 assert!(v == 0 || v == 1);91 Box::new(Val::Bool(v == 1))92}9394#[no_mangle]95pub extern "C" fn jsonnet_json_make_null(_vm: &EvaluationState) -> Box<Val> {96 Box::new(Val::Null)97}9899#[no_mangle]100pub extern "C" fn jsonnet_json_make_array(_vm: &EvaluationState) -> Box<Val> {101 Box::new(Val::Arr(Rc::new(Vec::new())))102}103104#[no_mangle]105pub extern "C" fn jsonnet_json_array_append(_vm: &EvaluationState, arr: &mut Val, val: &Val) {106 match arr {107 Val::Arr(old) => {108 let mut new = Vec::new();109 new.extend(old.iter().cloned());110 new.push(val.clone());111 *arr = Val::Arr(Rc::new(new));112 }113 _ => panic!("should receive array"),114 }115}116117#[no_mangle]118pub extern "C" fn jsonnet_json_make_object(_vm: &EvaluationState) -> Box<Val> {119 Box::new(Val::Obj(ObjValue::new_empty()))120}121122#[no_mangle]123pub extern "C" fn jsonnet_json_object_append(124 _vm: &EvaluationState,125 _obj: &mut Val,126 _name: *const c_char,127 _val: &Val,128) {129 todo!()130}131132#[no_mangle]133pub extern "C" fn jsonnet_realloc(_vm: &EvaluationState, _buf: *const u8, _sz: usize) -> *const u8 {134 todo!()135}136137#[no_mangle]138#[allow(clippy::boxed_local)]139pub extern "C" fn jsonnet_json_destroy(_vm: &EvaluationState, _v: Box<Val>) {}140141#[no_mangle]142pub extern "C" fn jsonnet_import_callback() {143 todo!()144}145#[no_mangle]146pub extern "C" fn jsonnet_native_callback() {147 todo!()148}149#[no_mangle]150pub extern "C" fn jsonnet_ext_var() {151 todo!()152}153#[no_mangle]154pub extern "C" fn jsonnet_ext_code() {155 todo!()156}157#[no_mangle]158pub extern "C" fn jsonnet_tla_var() {159 todo!()160}161#[no_mangle]162pub extern "C" fn jsonnet_tla_code() {163 todo!()164}165#[no_mangle]166pub extern "C" fn jsonnet_max_trace() {167 todo!()168}169#[no_mangle]170pub extern "C" fn jsonnet_jpath_add() {171 todo!()172}173174175176177#[no_mangle]178pub unsafe extern "C" fn jsonnet_evaluate_file(179 vm: &EvaluationState,180 filename: *const c_char,181 error: &mut c_int,182) -> *const c_char {183 vm.run_in_state(|| {184 use std::fmt::Write;185 let filename = CStr::from_ptr(filename);186 match vm.evaluate_file_to_json(&PathBuf::from(filename.to_str().unwrap())) {187 Ok(v) => {188 *error = 0;189 CString::new(&*v as &str).unwrap().into_raw()190 }191 Err(e) => {192 *error = 1;193 let mut out = String::new();194 writeln!(out, "{:?}", e.0).unwrap();195 for i in (e.1).0.iter() {196 writeln!(out, "{:?}", i).unwrap();197 }198 CString::new(&out as &str).unwrap().into_raw()199 }200 }201 })202}203#[no_mangle]204pub extern "C" fn jsonnet_evaluate_snippet() {205 todo!()206}207#[no_mangle]208pub extern "C" fn jsonnet_evaluate_file_multi() {209 todo!()210}211#[no_mangle]212pub extern "C" fn jsonnet_evaluate_snippet_multi() {213 todo!()214}215#[no_mangle]216pub extern "C" fn jsonnet_evaluate_file_stream() {217 todo!()218}219#[no_mangle]220pub extern "C" fn jsonnet_evaluate_snippet_stream() {221 todo!()222}223224#[no_mangle]225#[allow(clippy::boxed_local)]226pub extern "C" fn jsonnet_destroy(_vm: Box<EvaluationState>) {}