1
0
mirror of https://github.com/jhillyerd/inbucket.git synced 2025-12-18 01:57:02 +00:00

lua: Use table syntax for user object bindings (#325)

* lua: update bind_message to use table syntax

* lua: update bind_address to use table syntax
This commit is contained in:
James Hillyerd
2023-02-08 13:38:00 -08:00
committed by GitHub
parent 17b054b5a1
commit 239426692e
3 changed files with 101 additions and 135 deletions

View File

@@ -16,12 +16,8 @@ func registerMailAddressType(ls *lua.LState) {
ls.SetField(mt, "new", ls.NewFunction(newMailAddress))
// Methods.
ls.SetField(mt, "__index", ls.SetFuncs(ls.NewTable(), mailAddressMethods))
}
var mailAddressMethods = map[string]lua.LGFunction{
"address": mailAddressGetSetAddress,
"name": mailAddressGetSetName,
ls.SetField(mt, "__index", ls.NewFunction(mailAddressIndex))
ls.SetField(mt, "__newindex", ls.NewFunction(mailAddressNewIndex))
}
func newMailAddress(ls *lua.LState) int {
@@ -48,8 +44,8 @@ func unwrapMailAddress(ud *lua.LUserData) (*mail.Address, bool) {
return val, ok
}
func checkMailAddress(ls *lua.LState) *mail.Address {
ud := ls.CheckUserData(1)
func checkMailAddress(ls *lua.LState, pos int) *mail.Address {
ud := ls.CheckUserData(pos)
if val, ok := ud.Value.(*mail.Address); ok {
return val
}
@@ -57,28 +53,40 @@ func checkMailAddress(ls *lua.LState) *mail.Address {
return nil
}
func mailAddressGetSetAddress(ls *lua.LState) int {
val := checkMailAddress(ls)
if ls.GetTop() == 2 {
// Setter.
val.Address = ls.CheckString(2)
return 0
// Gets a field value from MailAddress user object. This emulates a Lua table,
// allowing `msg.subject` instead of a Lua object syntax of `msg:subject()`.
func mailAddressIndex(ls *lua.LState) int {
a := checkMailAddress(ls, 1)
field := ls.CheckString(2)
// Push the requested field's value onto the stack.
switch field {
case "name":
ls.Push(lua.LString(a.Name))
case "address":
ls.Push(lua.LString(a.Address))
default:
// Unknown field.
ls.Push(lua.LNil)
}
// Getter.
ls.Push(lua.LString(val.Address))
return 1
}
func mailAddressGetSetName(ls *lua.LState) int {
val := checkMailAddress(ls)
if ls.GetTop() == 2 {
// Setter.
val.Name = ls.CheckString(2)
return 0
// Sets a field value on MailAddress user object. This emulates a Lua table,
// allowing `msg.subject = x` instead of a Lua object syntax of `msg:subject(x)`.
func mailAddressNewIndex(ls *lua.LState) int {
a := checkMailAddress(ls, 1)
index := ls.CheckString(2)
switch index {
case "name":
a.Name = ls.CheckString(3)
case "address":
a.Address = ls.CheckString(3)
default:
ls.RaiseError("invalid index %q", index)
}
// Getter.
ls.Push(lua.LString(val.Name))
return 1
return 0
}