#[warn(unused_imports)]
extern crate libc;
use libc::size_t;
use libc::c_char;
use std::ffi::CStr;
#[warn(unused_mut)]
#[repr(C)]
struct JsonnetVm;
static mut _VM_LOCK:bool = false;
static mut _VM :*mut JsonnetVm = 0 as *mut JsonnetVm;
pub type JsonnetResult = Result<String, String>;
#[link(name = "jsonnet")]
extern {
#[warn(dead_code)]
fn jsonnet_version() -> *const c_char;
fn jsonnet_make() -> *mut JsonnetVm;
fn jsonnet_evaluate_file(vm: *mut JsonnetVm,filename: *const c_char,error:*mut size_t) -> *const c_char;
fn jsonnet_evaluate_snippet(vm: *mut JsonnetVm,filename: *const c_char,snippet: *const c_char,error:*mut size_t) ->*const c_char;
fn jsonnet_destroy(vm: *mut JsonnetVm);
}
#[warn(private_no_mangle_fns)]
fn ctos(msg : *const c_char)-> String{
let buf = unsafe { CStr::from_ptr(msg).to_bytes() };
let val = String::from_utf8(buf.to_vec()).unwrap();
return val;
}
pub struct Jsonnet;
impl Jsonnet {
#[no_mangle]
pub fn evaluate_file(filename: *const c_char) -> JsonnetResult {
unsafe {
if !_VM_LOCK {
_VM = jsonnet_make();
_VM_LOCK = true;
}
let mut error : size_t = 0 as size_t;
let data = jsonnet_evaluate_file(_VM,filename,&mut error);
if error == 0 {
Ok(ctos(data))
}else{
Err(ctos(data))
}
}
}
#[no_mangle]
pub fn evaluate_snippet(snippet: *const c_char) -> JsonnetResult {
unsafe {
if !_VM_LOCK {
_VM = jsonnet_make();
_VM_LOCK = true;
}
let mut error : size_t = 0 as size_t;
let data = jsonnet_evaluate_snippet(_VM,"snippet".as_ptr() as *const c_char,snippet,&mut error);
if error == 0 {
Ok(ctos(data))
}else{
Err(ctos(data))
}
}
}
#[no_mangle]
#[warn(dead_code)]
pub fn version() -> *const c_char {
unsafe {
return jsonnet_version();
}
}
#[no_mangle]
#[warn(dead_code)]
pub fn destroy() {
unsafe {
jsonnet_destroy(_VM);
_VM_LOCK = false;
}
}
}