package plugins import ( "fmt" lua "github.com/yuin/gopher-lua" ) // registerAPI creates the global `verstak` table with all API modules. func registerAPI(vm *LuaVM) { L := vm.L // Main verstak table verstak := L.NewTable() // Sub-modules verstak.RawSetString("node", registerNodeAPI(vm)) verstak.RawSetString("worklog", registerWorklogAPI(vm)) verstak.RawSetString("db", registerDBAPI(vm)) verstak.RawSetString("ui", registerUIAPI(vm)) verstak.RawSetString("config", registerConfigAPI(vm)) verstak.RawSetString("state", registerStateAPI(vm)) verstak.RawSetString("activity", registerActivityAPI(vm)) verstak.RawSetString("schedule", registerScheduleAPI(vm)) verstak.RawSetString("http", registerHTTPAPI(vm)) verstak.RawSetString("file", registerFileAPI(vm)) // Register as global L.SetGlobal("verstak", verstak) } // luaTableFromMap converts a Go map to a Lua table. func luaTableFromMap(L *lua.LState, m map[string]interface{}) *lua.LTable { tbl := L.NewTable() for k, v := range m { tbl.RawSetString(k, toLuaValue(L, v)) } return tbl } // luaTableFromList converts a Go slice to a Lua array table. func luaTableFromList(L *lua.LState, items []map[string]interface{}) *lua.LTable { tbl := L.NewTable() for i, item := range items { tbl.RawSetInt(i+1, luaTableFromMap(L, item)) } return tbl } // toLuaValue converts a Go value to a Lua value. func toLuaValue(L *lua.LState, v interface{}) lua.LValue { switch val := v.(type) { case nil: return lua.LNil case string: return lua.LString(val) case int: return lua.LNumber(val) case int64: return lua.LNumber(val) case float64: return lua.LNumber(val) case bool: return lua.LBool(val) case []interface{}: tbl := L.NewTable() for i, item := range val { tbl.RawSetInt(i+1, toLuaValue(L, item)) } return tbl case map[string]interface{}: return luaTableFromMap(L, val) default: return lua.LString(fmt.Sprintf("%v", v)) } }