zhangjinkun 7 년 전
부모
커밋
91f669f05d
2개의 변경된 파일99개의 추가작업 그리고 0개의 파일을 삭제
  1. 77 0
      src/jy/util/script.go
  2. 22 0
      src/jy/util/script_test.go

+ 77 - 0
src/jy/util/script.go

@@ -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
+}

+ 22 - 0
src/jy/util/script_test.go

@@ -0,0 +1,22 @@
+// script_test
+package util
+
+import (
+	"log"
+	"testing"
+)
+
+func Test_script(t *testing.T) {
+	lua := LuaScript{Code: "test", Name: "测试"}
+	lua.Doc = map[string]interface{}{"title": "测试标题", "detail": "正文"}
+	lua.Script = `
+		function main(dc)
+			local item={}
+			item["title"]=dc.title
+			item["detail"]=dc.detail
+			return item
+		end
+	`
+	rep := lua.RunScript()
+	log.Println(rep)
+}