@@ -219,26 +219,34 @@ func (t *Table) Append(rows ...interface{}) error { // rows is already []interfa
219219 return nil
220220}
221221
222- // Bulk adds multiple rows from a slice to the table (legacy method) .
223- // Parameter rows must be a slice compatible with stringer or []string.
224- // Returns an error if the input is invalid or appending fails .
222+ // Bulk adds multiple rows from a slice to the table.
223+ // If Behavior.AutoHeader is enabled, no headers set, and rows is a slice of structs,
224+ // automatically extracts/sets headers from the first struct .
225225func (t * Table ) Bulk (rows interface {}) error {
226- t .logger .Debug ("Starting Bulk operation" )
227226 rv := reflect .ValueOf (rows )
228227 if rv .Kind () != reflect .Slice {
229- err := errors .Newf ("Bulk expects a slice, got %T" , rows )
230- t .logger .Debugf ("Bulk error: %v" , err )
231- return err
228+ return errors .Newf ("Bulk expects a slice, got %T" , rows )
229+ }
230+ if rv .Len () == 0 {
231+ return nil
232+ }
233+
234+ if t .config .Behavior .AutoHeader .Enabled () && len (t .headers ) == 0 {
235+ first := rv .Index (0 ).Interface ()
236+ if reflect .TypeOf (first ).Kind () == reflect .Struct {
237+ headers := t .extractHeadersFromStruct (first )
238+ if len (headers ) > 0 {
239+ t .Header (headers )
240+ }
241+ }
232242 }
243+
233244 for i := 0 ; i < rv .Len (); i ++ {
234245 row := rv .Index (i ).Interface ()
235- t .logger .Debugf ("Processing bulk row %d: %v" , i , row )
236246 if err := t .appendSingle (row ); err != nil {
237- t .logger .Debugf ("Bulk append failed at index %d: %v" , i , err )
238247 return err
239248 }
240249 }
241- t .logger .Debugf ("Bulk completed, processed %d rows" , rv .Len ())
242250 return nil
243251}
244252
0 commit comments