jsonnet_sys/
lib.rs

1use libc::{c_char, c_double, c_int, c_uint, c_void, size_t};
2
3pub type JsonnetImportCallback = extern "C" fn(
4    ctx: *mut c_void,
5    base: *const c_char,
6    rel: *const c_char,
7    found_here: *mut *mut c_char,
8    success: *mut c_int,
9) -> *mut c_char;
10
11pub type JsonnetNativeCallback = extern "C" fn(
12    ctx: *mut c_void,
13    argv: *const *const JsonnetJsonValue,
14    success: *mut c_int,
15) -> *mut JsonnetJsonValue;
16
17pub enum JsonnetVm {}
18pub enum JsonnetJsonValue {}
19
20extern "C" {
21    pub fn jsonnet_version() -> *const c_char;
22
23    pub fn jsonnet_make() -> *mut JsonnetVm;
24    pub fn jsonnet_max_stack(vm: *mut JsonnetVm, v: c_uint);
25    pub fn jsonnet_gc_min_objects(vm: *mut JsonnetVm, v: c_uint);
26    pub fn jsonnet_gc_growth_trigger(vm: *mut JsonnetVm, v: c_double);
27    pub fn jsonnet_string_output(vm: *mut JsonnetVm, v: c_int);
28
29    pub fn jsonnet_json_extract_string(
30        vm: *mut JsonnetVm,
31        v: *const JsonnetJsonValue,
32    ) -> *const c_char;
33    pub fn jsonnet_json_extract_number(
34        vm: *mut JsonnetVm,
35        v: *const JsonnetJsonValue,
36        out: *mut c_double,
37    ) -> c_int;
38    pub fn jsonnet_json_extract_bool(vm: *mut JsonnetVm, v: *const JsonnetJsonValue) -> c_int;
39    pub fn jsonnet_json_extract_null(vm: *mut JsonnetVm, v: *const JsonnetJsonValue) -> c_int;
40
41    pub fn jsonnet_json_make_string(vm: *mut JsonnetVm, v: *const c_char) -> *mut JsonnetJsonValue;
42    pub fn jsonnet_json_make_number(vm: *mut JsonnetVm, v: c_double) -> *mut JsonnetJsonValue;
43    pub fn jsonnet_json_make_bool(vm: *mut JsonnetVm, v: c_int) -> *mut JsonnetJsonValue;
44    pub fn jsonnet_json_make_null(vm: *mut JsonnetVm) -> *mut JsonnetJsonValue;
45    pub fn jsonnet_json_make_array(vm: *mut JsonnetVm) -> *mut JsonnetJsonValue;
46    pub fn jsonnet_json_array_append(
47        vm: *mut JsonnetVm,
48        arr: *mut JsonnetJsonValue,
49        v: *mut JsonnetJsonValue,
50    );
51    pub fn jsonnet_json_make_object(vm: *mut JsonnetVm) -> *mut JsonnetJsonValue;
52    pub fn jsonnet_json_object_append(
53        vm: *mut JsonnetVm,
54        obj: *mut JsonnetJsonValue,
55        f: *const c_char,
56        v: *mut JsonnetJsonValue,
57    );
58
59    pub fn jsonnet_json_destroy(vm: *mut JsonnetVm, v: *mut JsonnetJsonValue);
60
61    pub fn jsonnet_realloc(vm: *mut JsonnetVm, buf: *const c_char, sz: size_t) -> *mut c_char;
62    pub fn jsonnet_import_callback(
63        vm: *mut JsonnetVm,
64        cb: *const JsonnetImportCallback,
65        ctx: *mut c_void,
66    );
67    pub fn jsonnet_native_callback(
68        vm: *mut JsonnetVm,
69        name: *const c_char,
70        cb: *const JsonnetNativeCallback,
71        ctx: *mut c_void,
72        params: *const *const c_char,
73    );
74
75    pub fn jsonnet_ext_var(vm: *mut JsonnetVm, key: *const c_char, val: *const c_char);
76    pub fn jsonnet_ext_code(vm: *mut JsonnetVm, key: *const c_char, val: *const c_char);
77
78    pub fn jsonnet_tla_var(vm: *mut JsonnetVm, key: *const c_char, val: *const c_char);
79    pub fn jsonnet_tla_code(vm: *mut JsonnetVm, key: *const c_char, val: *const c_char);
80
81    pub fn jsonnet_fmt_indent(vm: *mut JsonnetVm, n: c_int);
82    pub fn jsonnet_fmt_max_blank_lines(vm: *mut JsonnetVm, n: c_int);
83    pub fn jsonnet_fmt_string(vm: *mut JsonnetVm, c: c_int);
84    pub fn jsonnet_fmt_comment(vm: *mut JsonnetVm, c: c_int);
85    pub fn jsonnet_fmt_pad_arrays(vm: *mut JsonnetVm, v: c_int);
86    pub fn jsonnet_fmt_pad_objects(vm: *mut JsonnetVm, v: c_int);
87    pub fn jsonnet_fmt_pretty_field_names(vm: *mut JsonnetVm, v: c_int);
88    pub fn jsonnet_fmt_sort_imports(vm: *mut JsonnetVm, v: c_int);
89    pub fn jsonnet_fmt_debug_desugaring(vm: *mut JsonnetVm, v: c_int);
90    pub fn jsonnet_fmt_file(
91        vm: *mut JsonnetVm,
92        filename: *const c_char,
93        error: *mut c_int,
94    ) -> *mut c_char;
95    pub fn jsonnet_fmt_snippet(
96        vm: *mut JsonnetVm,
97        filename: *const c_char,
98        snippet: *const c_char,
99        error: *mut c_int,
100    ) -> *mut c_char;
101
102    pub fn jsonnet_max_trace(vm: *mut JsonnetVm, v: c_uint);
103
104    pub fn jsonnet_jpath_add(vm: *mut JsonnetVm, v: *const c_char);
105
106    pub fn jsonnet_evaluate_file(
107        vm: *mut JsonnetVm,
108        filename: *const c_char,
109        error: *mut c_int,
110    ) -> *mut c_char;
111    pub fn jsonnet_evaluate_snippet(
112        vm: *mut JsonnetVm,
113        filename: *const c_char,
114        snippet: *const c_char,
115        error: *mut c_int,
116    ) -> *mut c_char;
117    pub fn jsonnet_evaluate_file_multi(
118        vm: *mut JsonnetVm,
119        filename: *const c_char,
120        error: *mut c_int,
121    ) -> *mut c_char;
122    pub fn jsonnet_evaluate_snippet_multi(
123        vm: *mut JsonnetVm,
124        filename: *const c_char,
125        snippet: *const c_char,
126        error: *mut c_int,
127    ) -> *mut c_char;
128    pub fn jsonnet_evaluate_file_stream(
129        vm: *mut JsonnetVm,
130        filename: *const c_char,
131        error: *mut c_int,
132    ) -> *mut c_char;
133    pub fn jsonnet_evaluate_snippet_stream(
134        vm: *mut JsonnetVm,
135        filename: *const c_char,
136        snippet: *const c_char,
137        error: *mut c_int,
138    ) -> *mut c_char;
139
140    pub fn jsonnet_destroy(vm: *mut JsonnetVm);
141}
142
143#[test]
144fn basic_eval() {
145    use std::ffi::{CStr, CString};
146
147    let filename = CString::new("testdata").unwrap();
148    let snippet = CString::new("40 + 2").unwrap();
149    let expected = CString::new("42\n").unwrap();
150
151    unsafe {
152        let vm = jsonnet_make();
153
154        let mut error = 1;
155        let result = jsonnet_evaluate_snippet(vm, filename.as_ptr(), snippet.as_ptr(), &mut error);
156        assert_eq!(error, 0);
157        assert_eq!(CStr::from_ptr(result).to_bytes(), expected.as_bytes());
158
159        jsonnet_realloc(vm, result, 0);
160        jsonnet_destroy(vm);
161    }
162}