--- a/bindings/c/libjsonnet_test_file.c +++ b/bindings/c/libjsonnet_test_file.c @@ -16,6 +16,23 @@ #include "libjsonnet.h" +typedef struct JsonnetJsonValue* val_t; +typedef struct JsonnetVm* vm_t; + +typedef struct native_ctx_t { + vm_t vm +} native_ctx_t; + +val_t native_add(void* nctx, const struct JsonnetJsonValue* const* argv, int* success) { + native_ctx_t* ctx = nctx; + double a; + double b; + jsonnet_json_extract_number(ctx->vm, argv[0], &a); + jsonnet_json_extract_number(ctx->vm, argv[1], &b); + *success = 1; + return jsonnet_json_make_number(ctx->vm, a + b); +} + int main(int argc, const char **argv) { int error; @@ -26,6 +43,12 @@ return EXIT_FAILURE; } vm = jsonnet_make(); + + native_ctx_t* native_ctx = malloc(sizeof(native_ctx_t)); + native_ctx->vm = vm; + const char* params[3] = {"a", "b", NULL}; + jsonnet_native_callback(vm, "nativeAdd", native_add, native_ctx, params); + output = jsonnet_evaluate_file(vm, argv[1], &error); if (error) { fprintf(stderr, "%s", output); @@ -35,6 +58,7 @@ } printf("%s", output); jsonnet_realloc(vm, output, 0); + free(native_ctx); jsonnet_destroy(vm); return EXIT_SUCCESS; } --- /dev/null +++ b/bindings/test.jsonnet @@ -0,0 +1,5 @@ +{ + a: 1, + b: "hello", + c: std.native("nativeAdd")(2, 3), +}