Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: Add util functions to create tables from slices of structs (#217)
Co-authored-by: Calle Gustafsson <calle.gustafsson@chiefrebel.com> Co-authored-by: Marvin Wendt <git@marvinjwendt.com>
- Loading branch information
1 parent
6ff3ad2
commit c47acdd
Showing
3 changed files
with
75 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters