Skip to content

Commit

Permalink
feat: Add util functions to create tables from slices of structs (#217)
Browse files Browse the repository at this point in the history
Co-authored-by: Calle Gustafsson <calle.gustafsson@chiefrebel.com>
Co-authored-by: Marvin Wendt <git@marvinjwendt.com>
  • Loading branch information
3 people committed Jun 6, 2021
1 parent 6ff3ad2 commit c47acdd
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 1 deletion.
2 changes: 2 additions & 0 deletions putils/README.md
Expand Up @@ -14,4 +14,6 @@ func DownloadFileWithDefaultProgressbar(title, outputPath, url string, mode os.F
func DownloadFileWithProgressbar(progressbar *pterm.ProgressbarPrinter, outputPath, url string, mode os.FileMode) error
func RunWithDefaultSpinner(initzialSpinnerText string, f func(spinner *pterm.SpinnerPrinter) error) error
func RunWithSpinner(spinner *pterm.SpinnerPrinter, f func(spinner *pterm.SpinnerPrinter) error) error
func DefaultTableFromStructSlice(structSlice interface{}) *pterm.TablePrinter
func TableFromStructSlice(tablePrinter pterm.TablePrinter, structSlice interface{}) *pterm.TablePrinter
```
71 changes: 71 additions & 0 deletions putils/table-from-struct-slice.go
@@ -0,0 +1,71 @@
package putils

import (
"reflect"

"github.com/pterm/pterm"
)

// TableFromStructSlice accepts a customized table printer and and a slice of a struct.
// The table will be populated with the values of the structs. The header will be set to the structs field name.
// Use .WithHasHeader() to color the header.
// The function will return the populated pterm.TablePrinter.
func TableFromStructSlice(tablePrinter pterm.TablePrinter, structSlice interface{}) *pterm.TablePrinter {
to := reflect.TypeOf(structSlice)
if to.Kind() != reflect.Slice {
return &tablePrinter
}
el := to.Elem()

isPointer := false
if el.Kind() == reflect.Ptr {
el = el.Elem()
isPointer = true
}

if el.Kind() != reflect.Struct {
return &tablePrinter
}

numFields := el.NumField()
fieldNames := make([]string, numFields)

for i := 0; i < numFields; i++ {
fieldNames[i] = el.Field(i).Name
}

records := pterm.TableData{
fieldNames,
}

obj := reflect.ValueOf(structSlice)

items := make([]interface{}, obj.Len())
for i := 0; i < obj.Len(); i++ {
if isPointer {
items[i] = obj.Index(i).Elem().Interface()
} else {
items[i] = obj.Index(i).Interface()
}
}

for _, v := range items {
item := reflect.ValueOf(v)
record := make([]string, numFields)
for i := 0; i < numFields; i++ {
fieldVal := item.Field(i).Interface()
record[i] = pterm.Sprintf("%v", fieldVal)
}
records = append(records, record)
}
tablePrinter.Data = records

return &tablePrinter
}

// DefaultTableFromStructSlice will be populate the pterm.DefaultTable with the values of the structs. The header will be set to the structs field name.
// Use .WithHasHeader() to color the header.
// The function will return the populated pterm.TablePrinter.
func DefaultTableFromStructSlice(structSlice interface{}) *pterm.TablePrinter {
return TableFromStructSlice(pterm.DefaultTable, structSlice)
}
3 changes: 2 additions & 1 deletion table_printer_test.go
Expand Up @@ -2,9 +2,10 @@ package pterm

import (
"encoding/csv"
"github.com/stretchr/testify/assert"
"os"
"testing"

"github.com/stretchr/testify/assert"
)

func TestTablePrinter_NilPrint(t *testing.T) {
Expand Down

0 comments on commit c47acdd

Please sign in to comment.