mapserver/luaparser/luaparser.go
2019-06-13 08:04:32 +02:00

97 lines
1.6 KiB
Go

package luaparser
import (
"errors"
"github.com/yuin/gopher-lua"
"strconv"
)
func New() *LuaParser {
p := LuaParser{
state: lua.NewState(lua.Options{SkipOpenLibs: true}),
}
return &p
}
type LuaParser struct {
state *lua.LState
}
func parseMap(t *lua.LTable) map[string]interface{} {
result := make(map[string]interface{})
t.ForEach(func(k1, v1 lua.LValue) {
boolValue, ok := v1.(lua.LBool)
if ok {
result[k1.String()] = boolValue == lua.LTrue
}
intValue, ok := v1.(lua.LNumber)
if ok {
result[k1.String()], _ = strconv.Atoi(intValue.String())
}
strValue, ok := v1.(lua.LString)
if ok {
result[k1.String()] = strValue.String()
}
tblValue, ok := v1.(*lua.LTable)
if ok {
result[k1.String()] = parseMap(tblValue)
}
})
return result
}
func (this *LuaParser) ParseList(expr string) ([]map[string]interface{}, error) {
result := make([]map[string]interface{}, 0)
err := this.state.DoString(expr)
if err != nil {
return result, err
}
lv := this.state.Get(-1)
tbl, ok := lv.(*lua.LTable)
if !ok {
return result, errors.New("parsing failed")
}
tbl.ForEach(func(k, v lua.LValue) {
key, ok := v.(*lua.LTable)
if !ok {
return
}
mapresult := parseMap(key)
result = append(result, mapresult)
})
return result, nil
}
func (this *LuaParser) ParseMap(expr string) (map[string]interface{}, error) {
result := make(map[string]interface{})
err := this.state.DoString(expr)
if err != nil {
return result, err
}
lv := this.state.Get(-1)
tbl, ok := lv.(*lua.LTable)
if !ok {
return result, errors.New("parsing failed")
}
return parseMap(tbl), nil
}