|
@@ -0,0 +1,77 @@
|
|
|
+// script
|
|
|
+package util
|
|
|
+
|
|
|
+import (
|
|
|
+ "fmt"
|
|
|
+
|
|
|
+ "github.com/yuin/gopher-lua"
|
|
|
+)
|
|
|
+
|
|
|
+type LuaScript struct {
|
|
|
+ Code, Name, Script string
|
|
|
+ Doc map[string]interface{}
|
|
|
+ L *lua.LState
|
|
|
+}
|
|
|
+
|
|
|
+func (s *LuaScript) RunScript() map[string]interface{} {
|
|
|
+ data := map[string]interface{}{}
|
|
|
+ s.L = lua.NewState()
|
|
|
+ defer s.L.Close()
|
|
|
+ if err := s.L.DoString(s.Script); err != nil {
|
|
|
+ data["err"] = err.Error()
|
|
|
+ } else {
|
|
|
+ tab := MapToLuaTable(s.L, s.Doc)
|
|
|
+ if err := s.L.CallByParam(lua.P{
|
|
|
+ Fn: s.L.GetGlobal("main"),
|
|
|
+ NRet: 1,
|
|
|
+ Protect: true,
|
|
|
+ }, tab); err != nil {
|
|
|
+ data["err"] = err.Error()
|
|
|
+ }
|
|
|
+ ret := s.L.Get(-1)
|
|
|
+ s.L.Pop(1)
|
|
|
+ if tmp, ok := ret.(*lua.LTable); ok {
|
|
|
+ data["rep"] = LuaTableToMap(tmp)
|
|
|
+ } else {
|
|
|
+ data["rep"] = ret
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return data
|
|
|
+}
|
|
|
+
|
|
|
+func MapToLuaTable(l *lua.LState, obj map[string]interface{}) *lua.LTable {
|
|
|
+ tab := l.NewTable()
|
|
|
+ for k, v := range obj {
|
|
|
+ if val, ok := v.(string); ok {
|
|
|
+ tab.RawSet(lua.LString(k), lua.LString(val))
|
|
|
+ } else if val, ok := v.(int64); ok {
|
|
|
+ tab.RawSet(lua.LString(k), lua.LNumber(val))
|
|
|
+ } else if val, ok := v.(int32); ok {
|
|
|
+ tab.RawSet(lua.LString(k), lua.LNumber(val))
|
|
|
+ } else if val, ok := v.(float64); ok {
|
|
|
+ tab.RawSet(lua.LString(k), lua.LNumber(val))
|
|
|
+ } else if val, ok := v.(float32); ok {
|
|
|
+ tab.RawSet(lua.LString(k), lua.LNumber(val))
|
|
|
+ } else if val, ok := v.(bool); ok {
|
|
|
+ tab.RawSet(lua.LString(k), lua.LBool(val))
|
|
|
+ } else if val, ok := v.(map[string]interface{}); ok {
|
|
|
+ tab.RawSet(lua.LString(k), MapToLuaTable(l, val))
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return tab
|
|
|
+}
|
|
|
+
|
|
|
+func LuaTableToMap(param *lua.LTable) map[string]interface{} {
|
|
|
+ tmp := map[string]interface{}{}
|
|
|
+ param.ForEach(func(key, val lua.LValue) {
|
|
|
+ k := fmt.Sprint(key)
|
|
|
+ if v, ok := val.(lua.LString); ok {
|
|
|
+ tmp[k] = string(v)
|
|
|
+ } else if v, ok := val.(*lua.LTable); ok {
|
|
|
+ tmp[k] = LuaTableToMap(v)
|
|
|
+ } else {
|
|
|
+ tmp[k] = val
|
|
|
+ }
|
|
|
+ })
|
|
|
+ return tmp
|
|
|
+}
|