verstak/internal/core/plugins/api.go

77 lines
1.9 KiB
Go

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))
}
}