Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Add util functions to create tables from slices of structs #217

Merged
merged 7 commits into from Jun 6, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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