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}