Skip to content

Commit 91387cf

Browse files
committed
filter: lua: cosmetics
1 parent 188ee8e commit 91387cf

File tree

3 files changed

+37
-4
lines changed

3 files changed

+37
-4
lines changed

filter/lua.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"runtime"
66

77
"github.com/AdRoll/baker"
8+
89
lua "github.com/yuin/gopher-lua"
910
)
1011

@@ -16,11 +17,13 @@ var LUADesc = baker.FilterDesc{
1617
Help: `Run a baker filter defined in a lua script`,
1718
}
1819

20+
// LUAConfig holds the configuration for the LUA filter.
1921
type LUAConfig struct {
2022
Script string `help:"Path to the lua script where the baker filter is defined" required:"true"`
2123
FilterName string `help:"Name of the lua function to run as baker filter" required:"true"`
2224
}
2325

26+
// LUA allows to run a baker filter from an external script written in lua.
2427
type LUA struct {
2528
l *lua.LState // lua state used during all the baker filter lifetime
2629
ud *lua.LUserData // pre-allocated (reused) userdata for the processed record
@@ -29,6 +32,7 @@ type LUA struct {
2932
next func(baker.Record)
3033
}
3134

35+
// NewLUA returns a new LUA filter.
3236
func NewLUA(cfg baker.FilterParams) (baker.Filter, error) {
3337
dcfg := cfg.DecodedConfig.(*LUAConfig)
3438

@@ -69,9 +73,20 @@ func NewLUA(cfg baker.FilterParams) (baker.Filter, error) {
6973
return f, nil
7074
}
7175

76+
// registerLUATypes registers, in the given lua state, some lua types
77+
// and utility functions useful to run a baker filter:
78+
// - the record type
79+
// - createRecord function (creates and returns a new record)
80+
// - validateRecord function (takes a record and returns a boolean and a
81+
// number), see baker.ComponentParams.ValidateRecord
82+
// - fieldByName function (returns a field index given its name, or nil
83+
// if the given field name doesn't exist)
84+
// - fieldNames, an lua table where field names are indexed by their field
85+
// field indexes
7286
func registerLUATypes(l *lua.LState, comp baker.ComponentParams) {
7387
registerLUARecordType(l)
7488

89+
// Registers the 'createRecord' lua function.
7590
l.SetGlobal("createRecord", l.NewFunction(func(L *lua.LState) int {
7691
rec := comp.CreateRecord()
7792
ud := recordToLua(l, rec)
@@ -106,8 +121,14 @@ func registerLUATypes(l *lua.LState, comp baker.ComponentParams) {
106121
l.SetGlobal("fieldNames", fields)
107122
}
108123

124+
// TODO: at the moment LUA filter doesn't publish stats.
125+
// There are multiple ways to do it, either require the filter to update
126+
// the numbers of processed and filtered records, or deduce them automatically
127+
// by hooking into next and Process functions (if that proves too costly
128+
// this could be disabled in configuration.
109129
func (t *LUA) Stats() baker.FilterStats { return baker.FilterStats{} }
110130

131+
// Process forwards records to the lua-written filter.
111132
func (t *LUA) Process(rec baker.Record, next func(baker.Record)) {
112133
// Modify the record inside the pre-allocated user value
113134
t.ud.Value = &luaRecord{r: rec}
@@ -122,6 +143,8 @@ func (t *LUA) Process(rec baker.Record, next func(baker.Record)) {
122143
Protect: true,
123144
}, t.ud, t.luaNext)
124145

146+
// TODO: should not panic here and instead increment a filter-specific
147+
// metric that tracks the number of lua runtime errors.
125148
if err != nil {
126149
panic(err)
127150
}
@@ -131,19 +154,25 @@ func (t *LUA) Process(rec baker.Record, next func(baker.Record)) {
131154

132155
const luaRecordTypeName = "record"
133156

157+
// registers the 'record' type into the given lua state.
134158
func registerLUARecordType(L *lua.LState) {
135159
mt := L.NewTypeMetatable(luaRecordTypeName)
136160
L.SetGlobal(luaRecordTypeName, mt)
137161
L.SetField(mt, "__index", L.SetFuncs(L.NewTable(), luaRecordMethods))
138162
}
139163

164+
// converts a baker.Record to lua user data, suitable to be pushed onto
165+
// an lua stack.
140166
func recordToLua(L *lua.LState, r baker.Record) *lua.LUserData {
141167
ud := L.NewUserData()
142168
ud.Value = &luaRecord{r: r}
143169
L.SetMetatable(ud, L.GetTypeMetatable(luaRecordTypeName))
144170
return ud
145171
}
146172

173+
// checks that the element at current stack index n is an lua
174+
// user data, holding an luaRecord, and returns it. Raises an lua
175+
// runtime error if the element is not a record.
147176
func checkLuaRecord(L *lua.LState, n int) *luaRecord {
148177
ud := L.CheckUserData(n)
149178
if v, ok := ud.Value.(*luaRecord); ok {
@@ -153,17 +182,21 @@ func checkLuaRecord(L *lua.LState, n int) *luaRecord {
153182
return nil
154183
}
155184

185+
// faster version of checkLuaRecord that panics if the stack element
186+
// is not a record, rather than raising an lua runtime error.
156187
func fastcheckLuaRecord(L *lua.LState, n int) *luaRecord {
157188
return L.Get(n).(*lua.LUserData).Value.(*luaRecord)
158189
}
159190

191+
// holds the lua-bound methods of baker.Record.
160192
var luaRecordMethods = map[string]lua.LGFunction{
161193
"get": luaRecordGet,
162194
"set": luaRecordSet,
163195
"copy": luaRecordCopy,
164196
"clear": luaRecordClear,
165197
}
166198

199+
// lua wrapper over a baker Record.
167200
type luaRecord struct {
168201
r baker.Record
169202
}

filter/lua_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ end
2525
if err != nil {
2626
b.Fatal(err)
2727
}
28-
// fname := filepath.Join(b.TempDir(), "filters.lua")
28+
2929
fname := filepath.Join(dir, "filters.lua")
3030
if err := ioutil.WriteFile(fname, []byte(script), os.ModePerm); err != nil {
3131
b.Fatalf("can't write lua script: %v", err)

filter/testdata/lua_test.lua

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1+
-- use record:get and record:set to swap 2 fields
12
function swapFields(rec, next)
2-
local f1, f2
3-
f1 = rec:get(1)
4-
rec:set(1, rec:get(2))
3+
local f1, f2 = rec:get(1), rec:get(2)
4+
rec:set(1, f2)
55
rec:set(2, f1)
66
next(rec)
77
end

0 commit comments

Comments
 (0)