aboutsummaryrefslogtreecommitdiff
path: root/fromlua
diff options
context:
space:
mode:
Diffstat (limited to 'fromlua')
-rwxr-xr-xfromlua/generate.lua198
-rw-r--r--fromlua/generated.go320
-rw-r--r--fromlua/static.go59
3 files changed, 0 insertions, 577 deletions
diff --git a/fromlua/generate.lua b/fromlua/generate.lua
deleted file mode 100755
index 75899b7..0000000
--- a/fromlua/generate.lua
+++ /dev/null
@@ -1,198 +0,0 @@
-#!/usr/bin/env lua
-dofile("../parse_spec.lua")
-
-local readers = {
- SliceByte = true,
- Byte = true,
- String = true,
- SliceField = true,
- Field = true,
- Bool = true,
- PointedThing = true,
-}
-
-local static_uses = {
- "[3]int16",
- "AOID"
-}
-
-local function generate(name)
- local fnname, index, child, childfn, childtype
- local type = name
-
- local open = name:find("%[")
- local clos = name:find("%]")
-
- if open == 1 then
- index = name:sub(open + 1, clos - 1)
- child = name:sub(clos + 1)
- childfn, childtype = generate(child)
- fnname = (index == "" and "Slice" or "Vec" .. index) .. childfn
-
- type = "[" .. index .. "]" .. childtype
- else
- fnname = camel_case(name)
-
- local c = name:sub(1, 1)
- if c == c:upper() then
- type = "mt." .. name
- end
- end
-
- if not readers[fnname] then
- local fun = "func read" .. fnname .. "(l *lua.LState, val lua.LValue, ptr *" .. type .. ") {\n"
-
- if child then
- fun = fun .. "\tif val.Type() != lua.LTTable {\n\t\tpanic(\"invalid value for "
- .. name .. ": must be a table\")\n\t}\n"
-
- if index == "" then
- fun = fun ..
-[[
- tbl := val.(*lua.LTable)
- n := tbl.MaxN()
- *ptr = make(]] .. type .. [[, n)
- for i := range *ptr {
- read]] .. childfn .. [[(l, l.RawGetInt(tbl, i+1), &(*ptr)[i])
- }
-]]
- else
- local n = tonumber(index)
- for i, v in ipairs({"x", "y", "z"}) do
- if i > n then
- break
- end
-
- fun = fun
- .. "\tread" .. childfn
- .. "(l, l.GetField(val, \"" .. v .. "\"), &(*ptr)[" .. (i - 1) .. "])\n"
- end
- end
- else
- fun = fun .. "\tif val.Type() != lua.LTNumber {\n\t\tpanic(\"invalid value for "
- .. name .. ": must be a number\")\n\t}\n"
- .. "\t*ptr = " .. type .. "(val.(lua.LNumber))\n"
- end
-
- fun = fun .. "}\n\n"
-
- readers[fnname] = fun
- end
-
- return fnname, type
-end
-
-for _, use in ipairs(static_uses) do
- generate(use)
-end
-
-local function signature(name, prefix, type)
- local camel = camel_case(name)
- return "func read" .. camel .. "(l *lua.LState, val lua.LValue, ptr *" .. prefix .. camel .. ") {\n"
-end
-
-for name, fields in spairs(parse_spec("server/enum")) do
- local camel = camel_case(name)
- local fun = signature(name, "mt.")
-
- local impl = ""
- for _, var in ipairs(fields) do
- local equals = "*ptr = mt." .. apply_prefix(fields, var) .. "\n"
-
- if var == "no" then
- fun = fun .. "\tif val.Type() == lua.LTNil {\n\t\t" .. equals .. "\t\treturn\n\t}\n"
- else
- impl = impl .. "\tcase \"" .. var .. "\":\n\t\t" .. equals
- end
- end
-
- fun = fun
- .. "\tif val.Type() != lua.LTString {\n\t\tpanic(\"invalid value for "
- .. camel .. ": must be a string\")\n\t}\n"
- .. "\tstr := string(val.(lua.LString))\n"
- .. "\tswitch str {\n" .. impl
- .. "\tdefault:\n\t\tpanic(\"invalid value for " .. name .. ": \" + str)\n\t}\n}\n\n"
-
- readers[camel] = fun
-end
-
-for name, fields in spairs(parse_spec("server/flag")) do
- local camel = camel_case(name)
- local fun = signature(name, "mt.")
- .. "\tif val.Type() != lua.LTTable {\n\t\tpanic(\"invalid value for "
- .. camel .. ": must be a table\")\n\t}\n"
-
- for _, var in ipairs(fields) do
- fun = fun .. "\tif l.GetField(val, \"" .. var .. "\") == lua.LTrue {\n"
- .. "\t\t*ptr = *ptr | mt." .. apply_prefix(fields, var) .. "\n\t}\n"
- end
-
- fun = fun .. "}\n\n"
- readers[camel] = fun
-end
-
-local function fields_fromlua(fields, indent)
- local impl = ""
-
- for name, type in spairs(fields) do
- impl = impl .. indent .. "read" .. generate(type) .. "(l, l.GetField(val, \"" .. name .. "\"), &ptr."
- .. camel_case(name) .. ")\n"
- end
-
- return impl
-end
-
-for name, fields in spairs(parse_spec("server/struct", true)) do
- local camel = camel_case(name)
- readers[camel] = signature(name, "mt.")
- .. "\tif val.Type() != lua.LTTable {\n"
- .. "\t\tpanic(\"invalid value for " .. camel .. ": must be a table\")\n\t}\n"
- .. fields_fromlua(fields, "\t")
- .. "}\n\n"
-end
-
-local pkt_impl = ""
-
-for name, fields in spairs(parse_spec("server/pkt", true)) do
- pkt_impl = pkt_impl
- .. "\tcase \"" .. name .. "\"" .. "" .. ":\n"
- .. "\t\tptr := &mt.ToSrv" .. camel_case(name) .. "{}\n"
-
- if next(fields) then
- pkt_impl = pkt_impl
- .. "\t\tval := l.CheckTable(3)\n"
- .. fields_fromlua(fields, "\t\t")
- end
-
- pkt_impl = pkt_impl
- .. "\t\treturn ptr\n"
-end
-
-local funcs = ""
-for _, fn in spairs(readers) do
- if type(fn) == "string" then
- funcs = funcs .. fn
- end
-end
-
-local f = io.open("generated.go", "w")
-f:write([[
-// generated by generate.lua, DO NOT EDIT
-package fromlua
-
-import (
- "github.com/anon55555/mt"
- "github.com/yuin/gopher-lua"
-)
-
-]] .. funcs .. [[
-func Cmd(l *lua.LState) mt.Cmd {
- str := l.CheckString(2)
- switch str {
-]] .. pkt_impl .. [[
- }
-
- panic("invalid packet type: " + str)
-}
-]])
-f:close()
diff --git a/fromlua/generated.go b/fromlua/generated.go
deleted file mode 100644
index c93c229..0000000
--- a/fromlua/generated.go
+++ /dev/null
@@ -1,320 +0,0 @@
-// generated by generate.lua, DO NOT EDIT
-package fromlua
-
-import (
- "github.com/anon55555/mt"
- "github.com/yuin/gopher-lua"
-)
-
-func readAOID(l *lua.LState, val lua.LValue, ptr *mt.AOID) {
- if val.Type() != lua.LTNumber {
- panic("invalid value for AOID: must be a number")
- }
- *ptr = mt.AOID(val.(lua.LNumber))
-}
-
-func readCompressionModes(l *lua.LState, val lua.LValue, ptr *mt.CompressionModes) {
- if val.Type() != lua.LTNumber {
- panic("invalid value for CompressionModes: must be a number")
- }
- *ptr = mt.CompressionModes(val.(lua.LNumber))
-}
-
-func readInt16(l *lua.LState, val lua.LValue, ptr *int16) {
- if val.Type() != lua.LTNumber {
- panic("invalid value for int16: must be a number")
- }
- *ptr = int16(val.(lua.LNumber))
-}
-
-func readInt32(l *lua.LState, val lua.LValue, ptr *int32) {
- if val.Type() != lua.LTNumber {
- panic("invalid value for int32: must be a number")
- }
- *ptr = int32(val.(lua.LNumber))
-}
-
-func readInteraction(l *lua.LState, val lua.LValue, ptr *mt.Interaction) {
- if val.Type() != lua.LTString {
- panic("invalid value for Interaction: must be a string")
- }
- str := string(val.(lua.LString))
- switch str {
- case "dig":
- *ptr = mt.Dig
- case "stop_digging":
- *ptr = mt.StopDigging
- case "dug":
- *ptr = mt.Dug
- case "place":
- *ptr = mt.Place
- case "use":
- *ptr = mt.Use
- case "activate":
- *ptr = mt.Activate
- default:
- panic("invalid value for interaction: " + str)
- }
-}
-
-func readKeys(l *lua.LState, val lua.LValue, ptr *mt.Keys) {
- if val.Type() != lua.LTTable {
- panic("invalid value for Keys: must be a table")
- }
- if l.GetField(val, "forward") == lua.LTrue {
- *ptr = *ptr | mt.ForwardKey
- }
- if l.GetField(val, "backward") == lua.LTrue {
- *ptr = *ptr | mt.BackwardKey
- }
- if l.GetField(val, "left") == lua.LTrue {
- *ptr = *ptr | mt.LeftKey
- }
- if l.GetField(val, "right") == lua.LTrue {
- *ptr = *ptr | mt.RightKey
- }
- if l.GetField(val, "jump") == lua.LTrue {
- *ptr = *ptr | mt.JumpKey
- }
- if l.GetField(val, "special") == lua.LTrue {
- *ptr = *ptr | mt.SpecialKey
- }
- if l.GetField(val, "sneak") == lua.LTrue {
- *ptr = *ptr | mt.SneakKey
- }
- if l.GetField(val, "dig") == lua.LTrue {
- *ptr = *ptr | mt.DigKey
- }
- if l.GetField(val, "place") == lua.LTrue {
- *ptr = *ptr | mt.PlaceKey
- }
- if l.GetField(val, "zoom") == lua.LTrue {
- *ptr = *ptr | mt.ZoomKey
- }
-}
-
-func readPlayerPos(l *lua.LState, val lua.LValue, ptr *mt.PlayerPos) {
- if val.Type() != lua.LTTable {
- panic("invalid value for PlayerPos: must be a table")
- }
- readUint8(l, l.GetField(val, "fov80"), &ptr.FOV80)
- readKeys(l, l.GetField(val, "keys"), &ptr.Keys)
- readInt32(l, l.GetField(val, "pitch100"), &ptr.Pitch100)
- readVec3Int32(l, l.GetField(val, "pos100"), &ptr.Pos100)
- readVec3Int32(l, l.GetField(val, "vel100"), &ptr.Vel100)
- readUint8(l, l.GetField(val, "wanted_range"), &ptr.WantedRange)
- readInt32(l, l.GetField(val, "yaw100"), &ptr.Yaw100)
-}
-
-func readSliceSoundID(l *lua.LState, val lua.LValue, ptr *[]mt.SoundID) {
- if val.Type() != lua.LTTable {
- panic("invalid value for []SoundID: must be a table")
- }
- tbl := val.(*lua.LTable)
- n := tbl.MaxN()
- *ptr = make([]mt.SoundID, n)
- for i := range *ptr {
- readSoundID(l, l.RawGetInt(tbl, i+1), &(*ptr)[i])
- }
-}
-
-func readSliceString(l *lua.LState, val lua.LValue, ptr *[]string) {
- if val.Type() != lua.LTTable {
- panic("invalid value for []string: must be a table")
- }
- tbl := val.(*lua.LTable)
- n := tbl.MaxN()
- *ptr = make([]string, n)
- for i := range *ptr {
- readString(l, l.RawGetInt(tbl, i+1), &(*ptr)[i])
- }
-}
-
-func readSliceVec3Int16(l *lua.LState, val lua.LValue, ptr *[][3]int16) {
- if val.Type() != lua.LTTable {
- panic("invalid value for [][3]int16: must be a table")
- }
- tbl := val.(*lua.LTable)
- n := tbl.MaxN()
- *ptr = make([][3]int16, n)
- for i := range *ptr {
- readVec3Int16(l, l.RawGetInt(tbl, i+1), &(*ptr)[i])
- }
-}
-
-func readSoundID(l *lua.LState, val lua.LValue, ptr *mt.SoundID) {
- if val.Type() != lua.LTNumber {
- panic("invalid value for SoundID: must be a number")
- }
- *ptr = mt.SoundID(val.(lua.LNumber))
-}
-
-func readUint16(l *lua.LState, val lua.LValue, ptr *uint16) {
- if val.Type() != lua.LTNumber {
- panic("invalid value for uint16: must be a number")
- }
- *ptr = uint16(val.(lua.LNumber))
-}
-
-func readUint8(l *lua.LState, val lua.LValue, ptr *uint8) {
- if val.Type() != lua.LTNumber {
- panic("invalid value for uint8: must be a number")
- }
- *ptr = uint8(val.(lua.LNumber))
-}
-
-func readVec3Int16(l *lua.LState, val lua.LValue, ptr *[3]int16) {
- if val.Type() != lua.LTTable {
- panic("invalid value for [3]int16: must be a table")
- }
- readInt16(l, l.GetField(val, "x"), &(*ptr)[0])
- readInt16(l, l.GetField(val, "y"), &(*ptr)[1])
- readInt16(l, l.GetField(val, "z"), &(*ptr)[2])
-}
-
-func readVec3Int32(l *lua.LState, val lua.LValue, ptr *[3]int32) {
- if val.Type() != lua.LTTable {
- panic("invalid value for [3]int32: must be a table")
- }
- readInt32(l, l.GetField(val, "x"), &(*ptr)[0])
- readInt32(l, l.GetField(val, "y"), &(*ptr)[1])
- readInt32(l, l.GetField(val, "z"), &(*ptr)[2])
-}
-
-func Cmd(l *lua.LState) mt.Cmd {
- str := l.CheckString(2)
- switch str {
- case "chat_msg":
- ptr := &mt.ToSrvChatMsg{}
- val := l.CheckTable(3)
- readString(l, l.GetField(val, "msg"), &ptr.Msg)
- return ptr
- case "clt_ready":
- ptr := &mt.ToSrvCltReady{}
- val := l.CheckTable(3)
- readUint16(l, l.GetField(val, "formspec"), &ptr.Formspec)
- readUint8(l, l.GetField(val, "major"), &ptr.Major)
- readUint8(l, l.GetField(val, "minor"), &ptr.Minor)
- readUint8(l, l.GetField(val, "patch"), &ptr.Patch)
- readString(l, l.GetField(val, "version"), &ptr.Version)
- return ptr
- case "deleted_blks":
- ptr := &mt.ToSrvDeletedBlks{}
- val := l.CheckTable(3)
- readSliceVec3Int16(l, l.GetField(val, "blks"), &ptr.Blks)
- return ptr
- case "fall_dmg":
- ptr := &mt.ToSrvFallDmg{}
- val := l.CheckTable(3)
- readUint16(l, l.GetField(val, "amount"), &ptr.Amount)
- return ptr
- case "first_srp":
- ptr := &mt.ToSrvFirstSRP{}
- val := l.CheckTable(3)
- readBool(l, l.GetField(val, "empty_passwd"), &ptr.EmptyPasswd)
- readSliceByte(l, l.GetField(val, "salt"), &ptr.Salt)
- readSliceByte(l, l.GetField(val, "verifier"), &ptr.Verifier)
- return ptr
- case "got_blks":
- ptr := &mt.ToSrvGotBlks{}
- val := l.CheckTable(3)
- readSliceVec3Int16(l, l.GetField(val, "blks"), &ptr.Blks)
- return ptr
- case "init":
- ptr := &mt.ToSrvInit{}
- val := l.CheckTable(3)
- readUint16(l, l.GetField(val, "max_proto_ver"), &ptr.MaxProtoVer)
- readUint16(l, l.GetField(val, "min_proto_ver"), &ptr.MinProtoVer)
- readString(l, l.GetField(val, "player_name"), &ptr.PlayerName)
- readBool(l, l.GetField(val, "send_full_item_meta"), &ptr.SendFullItemMeta)
- readUint8(l, l.GetField(val, "serialize_ver"), &ptr.SerializeVer)
- readCompressionModes(l, l.GetField(val, "supported_compression"), &ptr.SupportedCompression)
- return ptr
- case "init2":
- ptr := &mt.ToSrvInit2{}
- val := l.CheckTable(3)
- readString(l, l.GetField(val, "lang"), &ptr.Lang)
- return ptr
- case "interact":
- ptr := &mt.ToSrvInteract{}
- val := l.CheckTable(3)
- readInteraction(l, l.GetField(val, "action"), &ptr.Action)
- readUint16(l, l.GetField(val, "item_slot"), &ptr.ItemSlot)
- readPointedThing(l, l.GetField(val, "pointed"), &ptr.Pointed)
- readPlayerPos(l, l.GetField(val, "pos"), &ptr.Pos)
- return ptr
- case "inv_action":
- ptr := &mt.ToSrvInvAction{}
- val := l.CheckTable(3)
- readString(l, l.GetField(val, "action"), &ptr.Action)
- return ptr
- case "inv_fields":
- ptr := &mt.ToSrvInvFields{}
- val := l.CheckTable(3)
- readSliceField(l, l.GetField(val, "fields"), &ptr.Fields)
- readString(l, l.GetField(val, "formname"), &ptr.Formname)
- return ptr
- case "join_mod_chan":
- ptr := &mt.ToSrvJoinModChan{}
- val := l.CheckTable(3)
- readString(l, l.GetField(val, "channel"), &ptr.Channel)
- return ptr
- case "leave_mod_chan":
- ptr := &mt.ToSrvLeaveModChan{}
- val := l.CheckTable(3)
- readString(l, l.GetField(val, "channel"), &ptr.Channel)
- return ptr
- case "msg_mod_chan":
- ptr := &mt.ToSrvMsgModChan{}
- val := l.CheckTable(3)
- readString(l, l.GetField(val, "channel"), &ptr.Channel)
- readString(l, l.GetField(val, "msg"), &ptr.Msg)
- return ptr
- case "nil":
- ptr := &mt.ToSrvNil{}
- return ptr
- case "node_meta_fields":
- ptr := &mt.ToSrvNodeMetaFields{}
- val := l.CheckTable(3)
- readSliceField(l, l.GetField(val, "fields"), &ptr.Fields)
- readString(l, l.GetField(val, "formname"), &ptr.Formname)
- readVec3Int16(l, l.GetField(val, "pos"), &ptr.Pos)
- return ptr
- case "player_pos":
- ptr := &mt.ToSrvPlayerPos{}
- val := l.CheckTable(3)
- readPlayerPos(l, l.GetField(val, "pos"), &ptr.Pos)
- return ptr
- case "removed_sounds":
- ptr := &mt.ToSrvRemovedSounds{}
- val := l.CheckTable(3)
- readSliceSoundID(l, l.GetField(val, "ids"), &ptr.IDs)
- return ptr
- case "req_media":
- ptr := &mt.ToSrvReqMedia{}
- val := l.CheckTable(3)
- readSliceString(l, l.GetField(val, "filenames"), &ptr.Filenames)
- return ptr
- case "respawn":
- ptr := &mt.ToSrvRespawn{}
- return ptr
- case "select_item":
- ptr := &mt.ToSrvSelectItem{}
- val := l.CheckTable(3)
- readUint16(l, l.GetField(val, "slot"), &ptr.Slot)
- return ptr
- case "srp_bytes_a":
- ptr := &mt.ToSrvSRPBytesA{}
- val := l.CheckTable(3)
- readSliceByte(l, l.GetField(val, "a"), &ptr.A)
- readBool(l, l.GetField(val, "no_sha1"), &ptr.NoSHA1)
- return ptr
- case "srp_bytes_m":
- ptr := &mt.ToSrvSRPBytesM{}
- val := l.CheckTable(3)
- readSliceByte(l, l.GetField(val, "m"), &ptr.M)
- return ptr
- }
-
- panic("invalid packet type: " + str)
-}
diff --git a/fromlua/static.go b/fromlua/static.go
deleted file mode 100644
index b989db8..0000000
--- a/fromlua/static.go
+++ /dev/null
@@ -1,59 +0,0 @@
-package fromlua
-
-import (
- "github.com/anon55555/mt"
- "github.com/yuin/gopher-lua"
-)
-
-//go:generate ./generate.lua
-
-func readBool(l *lua.LState, val lua.LValue, ptr *bool) {
- if val.Type() != lua.LTBool {
- panic("invalid value for bool: must be a boolean")
- }
- *ptr = bool(val.(lua.LBool))
-}
-
-func readString(l *lua.LState, val lua.LValue, ptr *string) {
- if val.Type() != lua.LTString {
- panic("invalid value for string: must be a string")
- }
- *ptr = string(val.(lua.LString))
-}
-
-func readSliceByte(l *lua.LState, val lua.LValue, ptr *[]byte) {
- if val.Type() != lua.LTString {
- panic("invalid value for []byte: must be a string")
- }
- *ptr = []byte(val.(lua.LString))
-}
-
-func readSliceField(l *lua.LState, val lua.LValue, ptr *[]mt.Field) {
- if val.Type() != lua.LTTable {
- panic("invalid value for []Field: must be a table")
- }
- val.(*lua.LTable).ForEach(func(k, v lua.LValue) {
- if k.Type() != lua.LTString || v.Type() != lua.LTString {
- panic("invalid value for Field: key and value must be strings")
- }
- *ptr = append(*ptr, mt.Field{Name: string(k.(lua.LString)), Value: string(v.(lua.LString))})
- })
-}
-
-func readPointedThing(l *lua.LState, val lua.LValue, ptr *mt.PointedThing) {
- if val.Type() != lua.LTTable {
- panic("invalid value for PointedThing: must be a table")
- }
- id := l.GetField(val, "id")
-
- if id == lua.LNil {
- pt := &mt.PointedAO{}
- readAOID(l, id, &(*pt).ID)
- *ptr = pt
- } else {
- pt := &mt.PointedNode{}
- readVec3Int16(l, l.GetField(val, "under"), &(*pt).Under)
- readVec3Int16(l, l.GetField(val, "above"), &(*pt).Above)
- *ptr = pt
- }
-}