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 }