73 lines
1.7 KiB
Go
73 lines
1.7 KiB
Go
package luajit
|
|
|
|
// TableBuilder provides a fluent interface for building Lua tables
|
|
type TableBuilder struct {
|
|
state *State
|
|
index int
|
|
}
|
|
|
|
// NewTableBuilder creates a new table and returns a builder
|
|
func (s *State) NewTableBuilder() *TableBuilder {
|
|
s.NewTable()
|
|
return &TableBuilder{
|
|
state: s,
|
|
index: s.GetTop(),
|
|
}
|
|
}
|
|
|
|
// SetString sets a string field
|
|
func (tb *TableBuilder) SetString(key, value string) *TableBuilder {
|
|
tb.state.PushString(value)
|
|
tb.state.SetField(tb.index, key)
|
|
return tb
|
|
}
|
|
|
|
// SetNumber sets a number field
|
|
func (tb *TableBuilder) SetNumber(key string, value float64) *TableBuilder {
|
|
tb.state.PushNumber(value)
|
|
tb.state.SetField(tb.index, key)
|
|
return tb
|
|
}
|
|
|
|
// SetBool sets a boolean field
|
|
func (tb *TableBuilder) SetBool(key string, value bool) *TableBuilder {
|
|
tb.state.PushBoolean(value)
|
|
tb.state.SetField(tb.index, key)
|
|
return tb
|
|
}
|
|
|
|
// SetNil sets a nil field
|
|
func (tb *TableBuilder) SetNil(key string) *TableBuilder {
|
|
tb.state.PushNil()
|
|
tb.state.SetField(tb.index, key)
|
|
return tb
|
|
}
|
|
|
|
// SetTable sets a table field
|
|
func (tb *TableBuilder) SetTable(key string, value any) *TableBuilder {
|
|
if err := tb.state.PushValue(value); err == nil {
|
|
tb.state.SetField(tb.index, key)
|
|
}
|
|
return tb
|
|
}
|
|
|
|
// SetArray sets an array field
|
|
func (tb *TableBuilder) SetArray(key string, values []any) *TableBuilder {
|
|
tb.state.CreateTable(len(values), 0)
|
|
for i, v := range values {
|
|
tb.state.PushNumber(float64(i + 1))
|
|
if err := tb.state.PushValue(v); err == nil {
|
|
tb.state.SetTable(-3)
|
|
} else {
|
|
tb.state.Pop(1)
|
|
}
|
|
}
|
|
tb.state.SetField(tb.index, key)
|
|
return tb
|
|
}
|
|
|
|
// Build finalizes the table (no-op, table is already on stack)
|
|
func (tb *TableBuilder) Build() {
|
|
// Table is already on the stack at tb.index
|
|
}
|