-
Notifications
You must be signed in to change notification settings - Fork 0
/
dyn_table.go
121 lines (97 loc) · 2.66 KB
/
dyn_table.go
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// based on https://github.com/tomlazar/table
package dyn_table
import (
"fmt"
"github.com/mattn/go-runewidth"
"github.com/mgutz/ansi"
)
const (
AlignLeft = iota
AlignRight
)
// Config is the
type Config struct {
ShowIndex bool // shows the index/row number as the first column
Color bool // use the color codes in the output
AlternateColors bool // alternate the colors when writing
TitleColorCode string // the ansi code for the title row
AltColorCodes []string // the ansi codes to alternate between
}
// DefaultConfig returns the default config for table, if its ever left null in a method this will be the one
// used to display the table
func DefaultConfig() *Config {
return &Config{
ShowIndex: false,
Color: true,
AlternateColors: true,
TitleColorCode: ansi.ColorCode("yellow+buf"),
AltColorCodes: []string{
"",
"\u001b[40m",
},
}
}
// DynTable is the struct used to define the structure, this can be used from a zero state, or inferred using the
// reflection based methods
type DynTable struct {
Width []int
Align []int
Headers []string
config *Config
rowColor bool
idxColumnWidth int
rowIdx int
}
func (t *DynTable) WriteHeader(conf *Config, idxColumnWidth int) {
if conf == nil {
t.config = DefaultConfig()
}
t.idxColumnWidth = idxColumnWidth
if t.config.Color {
fmt.Print(t.config.TitleColorCode)
}
if t.config.ShowIndex {
fmt.Printf(" [%*v] ", t.idxColumnWidth, "#")
}
for i, header := range t.Headers {
if len(t.Align) == 0 || t.Align[i] == AlignRight {
fmt.Printf(" %s", runewidth.FillLeft(header, t.Width[i]))
} else {
fmt.Printf(" %s", runewidth.FillRight(header, t.Width[i]))
}
}
if t.config.Color {
fmt.Print(ansi.Reset)
}
fmt.Println()
t.rowColor = t.config.Color && t.config.AlternateColors && len(t.config.AltColorCodes) > 1
}
func (t *DynTable) AppendRow(row []string) {
t.AppendRowWithColor(row,"")
}
func (t *DynTable) AppendRowWithColor(row []string, altColor string) {
if t.rowColor {
fmt.Print(t.config.AltColorCodes[t.rowIdx%len(t.config.AltColorCodes)])
}
if len(altColor) != 0 {
fmt.Print(ansi.ColorCode(altColor))
}
if t.config.ShowIndex {
fmt.Printf(" [%*v] ", t.idxColumnWidth, t.rowIdx+1)
}
for i, v := range row {
if runewidth.StringWidth(v) > t.Width[i] {
v = runewidth.Truncate(v, t.Width[i], "")
}
if len(t.Align) == 0 || t.Align[i] == AlignRight {
fmt.Printf(" %s", runewidth.FillLeft(v, t.Width[i]))
} else {
fmt.Printf(" %s", runewidth.FillRight(v, t.Width[i]))
}
}
if t.rowColor {
fmt.Print(ansi.Reset)
}
fmt.Println()
t.rowIdx += 1
}