mirror of
https://codeberg.org/scip/esctl.git
synced 2026-08-24 11:04:18 +02:00
enhance cluster status, add word wrap to wide table rows (#62)
This commit is contained in:
@@ -28,6 +28,7 @@ import (
|
||||
"github.com/olekukonko/tablewriter"
|
||||
"github.com/olekukonko/tablewriter/renderer"
|
||||
"github.com/olekukonko/tablewriter/tw"
|
||||
"github.com/seeruk/go-wordwrap"
|
||||
"gopkg.in/yaml.v3"
|
||||
)
|
||||
|
||||
@@ -38,10 +39,11 @@ type Table struct {
|
||||
|
||||
lenHeaders []int
|
||||
alignInts bool
|
||||
maxwidth int
|
||||
}
|
||||
|
||||
func NewTable(conf *cfg.Config, columns, rows int) *Table {
|
||||
table := Table{Mode: conf.Output}
|
||||
table := Table{Mode: conf.Output, maxwidth: cfg.GetTermWidth()}
|
||||
|
||||
table.Headers = make([]string, columns)
|
||||
table.Entries = make([][]string, rows)
|
||||
@@ -118,17 +120,31 @@ func (data *Table) PrintTSV() error {
|
||||
}
|
||||
|
||||
for _, entries := range data.Entries {
|
||||
currentWidth := 0
|
||||
for idx, entry := range entries {
|
||||
length := visibleLen(entry)
|
||||
|
||||
if data.lenHeaders[idx] < length {
|
||||
data.lenHeaders[idx] = length
|
||||
if length > currentWidth+data.maxwidth {
|
||||
data.lenHeaders[idx] = data.maxwidth - currentWidth
|
||||
} else {
|
||||
data.lenHeaders[idx] = length
|
||||
}
|
||||
}
|
||||
|
||||
currentWidth += data.lenHeaders[idx]
|
||||
}
|
||||
}
|
||||
|
||||
// output
|
||||
// output headers
|
||||
for idx, header := range data.Headers {
|
||||
fmt.Print(header, strings.Repeat(" ", data.lenHeaders[idx]-visibleLen(header)))
|
||||
if idx+1 != len(data.Headers) {
|
||||
fmt.Print(header, strings.Repeat(" ", data.lenHeaders[idx]-visibleLen(header)))
|
||||
} else {
|
||||
// no padding for last header
|
||||
fmt.Print(header)
|
||||
}
|
||||
|
||||
if idx < len(data.Headers)-1 {
|
||||
fmt.Print(" ")
|
||||
}
|
||||
@@ -136,14 +152,37 @@ func (data *Table) PrintTSV() error {
|
||||
fmt.Println()
|
||||
|
||||
for _, entries := range data.Entries {
|
||||
currentWidth := 0
|
||||
|
||||
for idx, entry := range entries {
|
||||
length := visibleLen(entry)
|
||||
|
||||
if length+currentWidth > data.maxwidth {
|
||||
// text is too wide to be put into one line, wrap it
|
||||
wrapper := wordwrap.Wrapper(data.maxwidth-currentWidth, false)
|
||||
wrapped := wrapper(entry)
|
||||
|
||||
// and indent it
|
||||
for idx, line := range strings.Split(wrapped, "\n") {
|
||||
if idx == 0 {
|
||||
entry = line
|
||||
} else {
|
||||
entry += "\n " + strings.Repeat(" ", currentWidth) + line
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
currentWidth += data.lenHeaders[idx]
|
||||
|
||||
if isInt(entry) && data.alignInts {
|
||||
// align right
|
||||
fmt.Print(strings.Repeat(" ", data.lenHeaders[idx]-length), entry)
|
||||
} else {
|
||||
} else if length < data.lenHeaders[idx] && idx+1 != len(entries) {
|
||||
// pad right, if required
|
||||
fmt.Print(entry, strings.Repeat(" ", data.lenHeaders[idx]-length))
|
||||
} else {
|
||||
// no padding for last entry
|
||||
fmt.Print(entry)
|
||||
}
|
||||
|
||||
if idx < len(data.Headers)-1 {
|
||||
|
||||
Reference in New Issue
Block a user