1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
package utils
import (
"fmt"
"io"
"strings"
)
// TableDisplayer is a simple table displayer
type TableDisplayer struct {
Header []string
Rows [][]string
Writer io.Writer
}
// NewTableDisplayer creates a new TableDisplayer
func NewTableDisplayer(w io.Writer, header []string) *TableDisplayer {
return &TableDisplayer{
Writer: w,
Header: header,
}
}
// AddRow adds a row to the table
func (t *TableDisplayer) AddRow(row ...string) {
// cut items if row is longer than header
if len(row) > len(t.Header) {
row = row[:len(t.Header)]
}
t.Rows = append(t.Rows, row)
}
// Display the table
func (t *TableDisplayer) Display() {
lens := make([]int, len(t.Header))
for i, h := range t.Header {
lens[i] = len(h)
}
for _, row := range t.Rows {
for i, r := range row {
if len(r) > lens[i] {
lens[i] = len(r)
}
}
}
outputs := [][]string{t.Header, {}}
for _, item := range t.Header {
outputs[1] = append(outputs[1], strings.Repeat("-", len(item)))
}
outputs = append(outputs, t.Rows...)
for _, row := range outputs {
for i, r := range row[:len(row)-1] {
fmt.Fprintf(t.Writer, "%-*s", lens[i]+2, r)
}
fmt.Fprintf(t.Writer, "%s\n", row[len(row)-1])
}
}
|