summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunwox <me@unwox.com>2024-10-15 14:32:09 +0600
committerunwox <me@unwox.com>2024-10-15 14:32:09 +0600
commit46a5b492b3396a879fb1fec985d906686a4266ed (patch)
treeed293e889496048ff7ed3a1235ef28e46c963bcc
parentb352ba53b25190efa811cdbf99509a38bab7d650 (diff)
standardize responses from luna modules
-rw-r--r--lua.go47
-rw-r--r--luajit.go46
-rw-r--r--main.go165
3 files changed, 153 insertions, 105 deletions
diff --git a/lua.go b/lua.go
index a400420..50c6fc5 100644
--- a/lua.go
+++ b/lua.go
@@ -99,7 +99,7 @@ func (l *Lua) StackLen() int {
return int(C.lua_gettop(l.l))
}
-// ToInt converts a stack value with stack index into a string.
+// ToString converts a stack value with stack index into a string.
func (l *Lua) ToString(index int) string {
return C.GoString(C.lua_tolstring(l.l, C.int(index), nil))
}
@@ -109,6 +109,11 @@ func (l *Lua) ToInt(index int) int {
return int(C.lua_tonumberx(l.l, C.int(index), nil))
}
+// ToBoolean converts a stack value with stack index -1 into a boolean.
+func (l *Lua) ToBoolean(index int) bool {
+ return int(C.lua_toboolean(l.l, C.int(index))) == 1
+}
+
// PopToRef pops the item (stack offset -1) from the stack and then stores it
// in the registry.
func (l *Lua) PopToRef() LuaRef {
@@ -120,17 +125,26 @@ func (l *Lua) Pop(n int) {
C.lua_settop(l.l, C.int(-n - 1))
}
-// PushNumber pushes tnil onto the Lua stack.
+// PushNil pushes tnil onto the Lua stack.
func (l *Lua) PushNil() {
C.lua_pushnil(l.l)
}
-// PushNumber pushes the number onto the Lua stack.
+// PushBoolean pushes a boolean onto the Lua stack.
+func (l *Lua) PushBoolean(b bool) {
+ if b {
+ C.lua_pushboolean(l.l, 1)
+ } else {
+ C.lua_pushboolean(l.l, 0)
+ }
+}
+
+// PushNumber pushes a number onto the Lua stack.
func (l *Lua) PushNumber(num int) {
C.lua_pushnumber(l.l, C.double(num))
}
-// PushNumber pushes the number onto the Lua stack.
+// PushFloatNumber pushes a float number onto the Lua stack.
func (l *Lua) PushFloatNumber(num float64) {
C.lua_pushnumber(l.l, C.double(num))
}
@@ -169,6 +183,8 @@ func (l *Lua) SetTableItem(key string) {
// PushAny pushes value v onto the stack.
func (l *Lua) PushAny(v any) error {
switch v.(type) {
+ case nil:
+ l.PushNil()
case string:
v, _ := v.(string)
l.PushString(v)
@@ -186,10 +202,16 @@ func (l *Lua) PushAny(v any) error {
l.PushFloatNumber(v)
case map[string]any:
v, _ := v.(map[string]any)
- return l.PushObject(v)
+ err := l.PushObject(v)
+ if err != nil {
+ return fmt.Errorf("array push errro: ", err)
+ }
case []any:
v, _ := v.([]any)
- return l.PushArray(v)
+ err := l.PushArray(v)
+ if err != nil {
+ return fmt.Errorf("array push errro: ", err)
+ }
case time.Time:
v, _ := v.(time.Time)
l.PushString(v.Format(time.DateTime))
@@ -252,6 +274,11 @@ func (l *Lua) IsNumber(index int) bool {
return C.lua_isnumber(l.l, C.int(index)) == 1
}
+// IsBoolean checks if the stack contains a boolean under the given index.
+func (l *Lua) IsBoolean(index int) bool {
+ return C.lua_type(l.l, C.int(index)) == C.LUA_TBOOLEAN
+}
+
// IsFunction checks if the stack contains a function under the given index.
func (l *Lua) IsFunction(index int) bool {
return C.lua_type(l.l, C.int(index)) == C.LUA_TFUNCTION
@@ -263,6 +290,7 @@ func (l *Lua) IsTable(index int) bool {
}
// Next advances a table iterator at the stack index -2.
+// IsTable checks if the stack contains a table under the given index.
func (l *Lua) Next() bool {
return C.lua_next(l.l, -2) != 0
}
@@ -372,6 +400,8 @@ func (l *Lua) Scan(vars ...any) error {
v = l.ToString(-1)
} else if l.IsNumber(-1) {
v = l.ToInt(-1)
+ } else if l.IsBoolean(-1) {
+ v = l.ToBoolean(-1)
} else if l.IsNil(-1) {
v = nil
} else {
@@ -422,3 +452,8 @@ func (l *Lua) GetGlobal(name string) {
defer C.free(unsafe.Pointer(cstr))
C.lua_getglobal(l.l, cstr)
}
+
+func (l *Lua) Error(msg string) {
+ l.PushString(msg)
+ C.lua_error(l.l)
+}
diff --git a/luajit.go b/luajit.go
index 2ee8b55..1a8b47d 100644
--- a/luajit.go
+++ b/luajit.go
@@ -95,7 +95,7 @@ func (l *Lua) StackLen() int {
return int(C.lua_gettop(l.l))
}
-// ToInt converts a stack value with stack index into a string.
+// ToString converts a stack value with stack index into a string.
func (l *Lua) ToString(index int) string {
return C.GoString(C.lua_tolstring(l.l, C.int(index), nil))
}
@@ -105,6 +105,11 @@ func (l *Lua) ToInt(index int) int {
return int(C.lua_tonumberx(l.l, C.int(index), nil))
}
+// ToBoolean converts a stack value with stack index -1 into a boolean.
+func (l *Lua) ToBoolean(index int) bool {
+ return int(C.lua_toboolean(l.l, C.int(index))) == 1
+}
+
// PopToRef pops the item (stack offset -1) from the stack and then stores it
// in the registry.
func (l *Lua) PopToRef() LuaRef {
@@ -116,17 +121,26 @@ func (l *Lua) Pop(n int) {
C.lua_settop(l.l, C.int(-n - 1))
}
-// PushNumber pushes tnil onto the Lua stack.
+// PushNil pushes tnil onto the Lua stack.
func (l *Lua) PushNil() {
C.lua_pushnil(l.l)
}
-// PushNumber pushes the number onto the Lua stack.
+// PushBoolean pushes a boolean onto the Lua stack.
+func (l *Lua) PushBoolean(b bool) {
+ if b {
+ C.lua_pushboolean(l.l, 1)
+ } else {
+ C.lua_pushboolean(l.l, 0)
+ }
+}
+
+// PushNumber pushes a number onto the Lua stack.
func (l *Lua) PushNumber(num int) {
C.lua_pushnumber(l.l, C.double(num))
}
-// PushNumber pushes the number onto the Lua stack.
+// PushFloatNumber pushes a float number onto the Lua stack.
func (l *Lua) PushFloatNumber(num float64) {
C.lua_pushnumber(l.l, C.double(num))
}
@@ -165,6 +179,8 @@ func (l *Lua) SetTableItem(key string) {
// PushAny pushes value v onto the stack.
func (l *Lua) PushAny(v any) error {
switch v.(type) {
+ case nil:
+ l.PushNil()
case string:
v, _ := v.(string)
l.PushString(v)
@@ -182,10 +198,16 @@ func (l *Lua) PushAny(v any) error {
l.PushFloatNumber(v)
case map[string]any:
v, _ := v.(map[string]any)
- l.PushObject(v)
+ err := l.PushObject(v)
+ if err != nil {
+ return fmt.Errorf("object push error: ", err)
+ }
case []any:
v, _ := v.([]any)
- l.PushArray(v)
+ err := l.PushArray(v)
+ if err != nil {
+ return fmt.Errorf("array push error: ", err)
+ }
case time.Time:
v, _ := v.(time.Time)
l.PushString(v.Format(time.DateTime))
@@ -248,6 +270,11 @@ func (l *Lua) IsNumber(index int) bool {
return C.lua_isnumber(l.l, C.int(index)) == 1
}
+// IsBoolean checks if the stack contains a boolean under the given index.
+func (l *Lua) IsBoolean(index int) bool {
+ return C.lua_type(l.l, C.int(index)) == C.LUA_TBOOLEAN
+}
+
// IsFunction checks if the stack contains a function under the given index.
func (l *Lua) IsFunction(index int) bool {
return C.lua_type(l.l, C.int(index)) == C.LUA_TFUNCTION
@@ -368,6 +395,8 @@ func (l *Lua) Scan(vars ...any) error {
v = l.ToString(-1)
} else if l.IsNumber(-1) {
v = l.ToInt(-1)
+ } else if l.IsBoolean(-1) {
+ v = l.ToBoolean(-1)
} else if l.IsNil(-1) {
v = nil
} else {
@@ -418,3 +447,8 @@ func (l *Lua) GetGlobal(name string) {
defer C.free(unsafe.Pointer(cstr))
C.lua_getfield(l.l, C.LUA_GLOBALSINDEX, cstr)
}
+
+func (l *Lua) Error(msg string) {
+ l.PushString(msg)
+ C.lua_error(l.l)
+}
diff --git a/main.go b/main.go
index 993c7bb..dd5e7fe 100644
--- a/main.go
+++ b/main.go
@@ -54,12 +54,10 @@ func main() {
routeModule := make(map[string]any)
routeModule["route"] = func (l *Lua) int {
var route string
- var fn LuaRef
+ var fn LuaRef
err := l.Scan(&route, &fn)
if err != nil {
- fmt.Println("error:", err)
- // FIXME: handle
- return 0
+ return luaErr(l, err)
}
// find corresponding worker for the lua context
var wrk *Worker
@@ -70,13 +68,13 @@ func main() {
}
}
if wrk == nil {
- return 0
+ return luaOk(l, nil)
}
// check if route is already registered. otherwise
// mux.HandleFunc will panic
_, ok := routes[route]
if ok {
- return 0
+ return luaOk(l, nil)
}
routes[route] = true
mux.HandleFunc(
@@ -99,28 +97,26 @@ func main() {
)
},
)
- return 0
+ return luaOk(l, nil)
}
routeModule["static"] = func (l *Lua) int {
var route, dir string
err := l.Scan(&route, &dir)
if err != nil {
- fmt.Println("error:", err)
- // FIXME: handle
- return 0
+ return luaErr(l, err)
}
// check if route is already registered. otherwise
// mux.HandleFunc will panic
_, ok := routes[route]
if ok {
- return 0
+ return luaOk(l, nil)
}
routes[route] = true
mux.Handle(
route,
http.StripPrefix("/static/", http.FileServer(http.Dir(dir))),
)
- return 0
+ return luaOk(l, nil)
}
// define luna.http module
@@ -130,39 +126,35 @@ func main() {
headers := make(map[string]string)
err := l.Scan(&method, &url, &headers, &body)
if err != nil {
- // FIXME: handle
- fmt.Println("error:", err)
- return 0
+ return luaErr(l, err)
}
req, err := http.NewRequest(method, url, strings.NewReader(body))
if err != nil {
- // FIXME: return error
- return 0
+ return luaErr(l, err)
}
for k, v := range headers {
req.Header.Add(k, v)
}
resp, err := httpClient.Do(req)
if err != nil {
- // FIXME: return error
- return 0
+ return luaErr(l, err)
}
defer resp.Body.Close()
respBody, err := io.ReadAll(resp.Body)
if err != nil {
- // FIXME: return error
- return 0
+ return luaErr(l, err)
}
respHeaders := make(map[string]any)
for k := range resp.Header {
respHeaders[k] = resp.Header.Get(k)
}
- l.PushNumber(resp.StatusCode)
- l.PushObject(respHeaders)
- l.PushString(string(respBody))
- return 3
+ res := make(map[string]any)
+ res["status"] = resp.StatusCode
+ res["headers"] = respHeaders
+ res["body"] = string(respBody)
+ return luaOk(l, res)
}
// define luna.db module
@@ -171,69 +163,59 @@ func main() {
var file string
err := l.Scan(&file)
if err != nil {
- // FIXME: handle.
- return 0
+ return luaErr(l, err)
}
db, err := sql.Open("sqlite3", file)
if err != nil {
- // FIXME: handle.
- return 0
+ return luaErr(l, err)
}
dbmu.Lock()
dbs = append(dbs, db)
dbmu.Unlock()
h := cgo.NewHandle(db)
- l.PushNumber(int(h))
- return 1
+ return luaOk(l, int(h))
}
dbModule["begin"] = func (l *Lua) int {
var handle cgo.Handle
err := l.Scan(&handle)
if err != nil {
- // FIXME: handle.
- return 0
+ return luaErr(l, err)
}
db := handle.Value().(*sql.DB)
tx, err := db.Begin()
if err != nil {
- // FIXME: handle.
- return 0
+ return luaErr(l, err)
}
txh := cgo.NewHandle(tx)
- l.PushNumber(int(txh))
- return 1
+ return luaOk(l, int(txh))
}
dbModule["commit"] = func (l *Lua) int {
var handle cgo.Handle
err := l.Scan(&handle)
if err != nil {
- // FIXME: handle.
- return 0
+ return luaErr(l, err)
}
tx := handle.Value().(*sql.Tx)
err = tx.Commit()
if err != nil {
- // FIXME: handle.
- return 0
+ return luaErr(l, err)
}
handle.Delete()
- return 0
+ return luaOk(l, nil)
}
dbModule["rollback"] = func (l *Lua) int {
var handle cgo.Handle
err := l.Scan(&handle)
if err != nil {
- // FIXME: handle.
- return 0
+ return luaErr(l, err)
}
tx := handle.Value().(*sql.Tx)
err = tx.Rollback()
if err != nil {
- // FIXME: handle.
- return 0
+ return luaErr(l, err)
}
handle.Delete()
- return 0
+ return luaOk(l, nil)
}
dbModule["exec-tx"] = func (l *Lua) int {
var handle cgo.Handle
@@ -241,18 +223,14 @@ func main() {
var params []any
err := l.Scan(&handle, &query, &params)
if err != nil {
- fmt.Println(err)
- // FIXME: handle.
- return 0
+ return luaErr(l, err)
}
tx := handle.Value().(*sql.Tx)
_, err = tx.Exec(query, params...)
if err != nil {
- fmt.Println(err)
- // FIXME: handle.
- return 0
+ return luaErr(l, err)
}
- return 0
+ return luaOk(l, nil)
}
dbModule["exec"] = func (l *Lua) int {
var handle cgo.Handle
@@ -260,18 +238,14 @@ func main() {
var params []any
err := l.Scan(&handle, &query, &params)
if err != nil {
- fmt.Println(err)
- // FIXME: handle.
- return 0
+ return luaErr(l, err)
}
db := handle.Value().(*sql.DB)
_, err = db.Exec(query, params...)
if err != nil {
- fmt.Println(err)
- // FIXME: handle.
- return 0
+ return luaErr(l, err)
}
- return 0
+ return luaOk(l, nil)
}
dbModule["query"] = func (l *Lua) int {
var handle cgo.Handle
@@ -279,15 +253,12 @@ func main() {
var params []any
err := l.Scan(&handle, &query, &params)
if err != nil {
- fmt.Println(err)
- // FIXME: handle.
- return 0
+ return luaErr(l, err)
}
db := handle.Value().(*sql.DB)
rows, err := db.Query(query, params...)
if err != nil {
- // FIXME: handle.
- return 0
+ return luaErr(l, err)
}
var res [][]any
cols, _ := rows.Columns()
@@ -309,11 +280,9 @@ func main() {
}
err = l.PushArray(ares)
if err != nil {
- fmt.Println(err)
- // FIXME: handle
- return 0
+ return luaErr(l, err)
}
- return 1
+ return luaOk(l, ares)
}
dbModule["query*"] = func (l *Lua) int {
var handle cgo.Handle
@@ -321,14 +290,12 @@ func main() {
var params []any
err := l.Scan(&handle, &query, &params)
if err != nil {
- // FIXME: handle.
- return 0
+ return luaErr(l, err)
}
db := handle.Value().(*sql.DB)
rows, err := db.Query(query, params...)
if err != nil {
- // FIXME: handle.
- return 0
+ return luaErr(l, err)
}
var res []map[string]any
cols, _ := rows.Columns()
@@ -348,25 +315,18 @@ func main() {
for _, v := range res {
ares = append(ares, v)
}
- err = l.PushArray(ares)
- if err != nil {
- // FIXME: handle
- return 0
- }
- return 1
+ return luaOk(l, ares)
}
dbModule["close"] = func (l *Lua) int {
var handle cgo.Handle
err := l.Scan(&handle)
if err != nil {
- // FIXME: handle.
- return 0
+ return luaErr(l, err)
}
db := handle.Value().(*sql.DB)
err = db.Close()
if err != nil {
- // FIXME: handle.
- return 0
+ return luaErr(l, err)
}
dbmu.Lock()
for k, _db := range dbs {
@@ -377,31 +337,35 @@ func main() {
}
dbmu.Unlock()
handle.Delete()
- return 0
+ return luaOk(l, nil)
}
// define luna.utf module
utfModule := make(map[string]any)
+ utfModule["len"] = func (l *Lua) int {
+ var str string
+ err := l.Scan(&str)
+ if err != nil {
+ return luaErr(l, err)
+ }
+ return luaOk(l, len(str))
+ }
utfModule["lower"] = func (l *Lua) int {
var str string
err := l.Scan(&str)
if err != nil {
- // FIXME: handle.
- return 0
+ return luaErr(l, err)
}
- l.PushString(strings.ToLower(str))
- return 1
+ return luaOk(l, strings.ToLower(str))
}
utfModule["sub"] = func (l *Lua) int {
var str string
var start, length int
err := l.Scan(&str, &start, &length)
if err != nil {
- // FIXME: handle.
- return 0
+ return luaErr(l, err)
}
- l.PushString(str[start-1:length])
- return 1
+ return luaOk(l, str[start-1:start-1+length])
}
module := make(map[string]any)
@@ -466,3 +430,18 @@ func mustExist(file string) {
os.Exit(1)
}
}
+
+func luaErr(l *Lua, err error) int {
+ l.PushBoolean(false)
+ l.PushString(err.Error())
+ return 2
+}
+
+func luaOk(l *Lua, res any) int {
+ l.PushBoolean(true)
+ err := l.PushAny(res)
+ if err != nil {
+ return luaErr(l, fmt.Errorf("luaOk: %s", err))
+ }
+ return 2
+}