diff options
| author | unwox <me@unwox.com> | 2024-10-15 14:32:09 +0600 |
|---|---|---|
| committer | unwox <me@unwox.com> | 2024-10-15 14:32:09 +0600 |
| commit | 46a5b492b3396a879fb1fec985d906686a4266ed (patch) | |
| tree | ed293e889496048ff7ed3a1235ef28e46c963bcc | |
| parent | b352ba53b25190efa811cdbf99509a38bab7d650 (diff) | |
standardize responses from luna modules
| -rw-r--r-- | lua.go | 47 | ||||
| -rw-r--r-- | luajit.go | 46 | ||||
| -rw-r--r-- | main.go | 165 |
3 files changed, 153 insertions, 105 deletions
@@ -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) +} @@ -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) +} @@ -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, ¶ms) 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, ¶ms) 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, ¶ms) 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, ¶ms) 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 +} |
