calog/src/mruby/mrubyEngine.c
2026-07-04 20:25:00 -05:00

61 lines
1.9 KiB
C

// mrubyEngine.c -- bridges the mruby adapter to the actor layer's CalogEngineT vtable.
//
// Every hook runs on the owning context's thread (createInterpreter, runSource,
// destroyInterpreter), confining the mruby VM (one mrb_state) to one thread. createInterpreter
// builds the VM and exposes the registered natives; runSource evaluates a script and reports
// failure through the single error channel (result).
#include "calogInternal.h"
#include "mrubyAdapter.h"
static int32_t mrubyEngineCreate(CalogContextT *context, void **interpOut);
static void mrubyEngineDestroy(void *interp);
static int32_t mrubyEngineRun(void *interp, const char *source, CalogValueT *result);
static void mrubyExposeVisitor(const CalogEntryT *entry, void *ud);
static const char *const mrubyExtensions[] = { "rb", NULL };
const CalogEngineT calogMrubyEngine = {
"mruby",
mrubyExtensions,
mrubyEngineCreate,
mrubyEngineDestroy,
mrubyEngineRun
};
static int32_t mrubyEngineCreate(CalogContextT *context, void **interpOut) {
CalogMrubyT *rb;
int32_t status;
*interpOut = NULL;
status = calogMrubyCreate(&rb, calogContextBroker(context), calogContextId(context));
if (status != calogOkE) {
return status;
}
calogForEach(calogContextBroker(context), mrubyExposeVisitor, rb);
*interpOut = rb;
return calogOkE;
}
static void mrubyEngineDestroy(void *interp) {
calogMrubyDestroy((CalogMrubyT *)interp);
}
static int32_t mrubyEngineRun(void *interp, const char *source, CalogValueT *result) {
int32_t status;
calogValueNil(result);
status = calogMrubyRun((CalogMrubyT *)interp, source);
if (status != calogOkE) {
return calogFail(result, status, "mruby script failed");
}
return calogOkE;
}
static void mrubyExposeVisitor(const CalogEntryT *entry, void *ud) {
calogMrubyExpose((CalogMrubyT *)ud, entry->name);
}