jsonnet-go-sys 0.1.1+go-jsonnet-v0.20.0

Rust bindings for the go-jsonnet C API
use std::ffi::CStr;

use jsonnet_go_sys::*;

const JSONNET: &str = "{ field: std.base64('abcd') }\0";

#[derive(Debug, serde::Deserialize)]
struct Basic {
    field: String,
}

#[test]
fn smoketest() {
    let filename = CStr::from_bytes_with_nul(b"basic.jsonnet\0").unwrap();
    let jsonnet = CStr::from_bytes_with_nul(JSONNET.as_bytes()).unwrap();

    let vm = unsafe { jsonnet_make() };

    let mut error = 0;
    let messageptr = unsafe {
        jsonnet_evaluate_snippet(
            vm,
            filename.as_ptr() as _,
            jsonnet.as_ptr() as _,
            &mut error,
        )
    };

    let message = unsafe { CStr::from_ptr(messageptr) };
    let message = message.to_str().unwrap();

    if error != 0 {
        panic!("jsonnet evaluation returned an error: {message}");
    }

    let json: Basic = serde_json::from_str(message).unwrap();
    assert_eq!(json.field, "YWJjZA==");

    unsafe { jsonnet_realloc(vm, messageptr, 0) };
    unsafe { jsonnet_destroy(vm) };
}