influx-cli/pkg/template/table_printer.go
2021-06-24 11:31:19 -04:00

111 lines
2.1 KiB
Go

package template
import (
"fmt"
"io"
"strconv"
"strings"
"github.com/olekukonko/tablewriter"
)
type TablePrinter struct {
w io.Writer
writer *tablewriter.Table
useColor bool
title string
headerLen int
appendCalls int
}
func NewTablePrinter(w io.Writer, hasColor, hasBorder bool) *TablePrinter {
wr := tablewriter.NewWriter(w)
wr.SetBorder(hasBorder)
wr.SetRowLine(hasBorder)
return &TablePrinter{
w: w,
writer: wr,
useColor: hasColor,
}
}
func (t *TablePrinter) Render() {
if t.appendCalls == 0 {
return
}
title := strings.ToUpper(t.title)
if t.useColor {
title = colorTitle.Sprint(title)
}
fmt.Fprintln(t.w, title)
t.setFooter()
t.writer.Render()
}
func (t *TablePrinter) Title(title string) *TablePrinter {
t.title = title
return t
}
func (t *TablePrinter) SetHeaders(headers ...string) *TablePrinter {
t.headerLen = len(headers)
t.writer.SetHeader(headers)
headerColors := make([]tablewriter.Colors, t.headerLen)
alignments := make([]int, t.headerLen)
color := noColor
if t.useColor {
color = colorHeader
}
for i, header := range headers {
headerColors[i] = color
if strings.EqualFold("description", header) {
t.writer.SetColMinWidth(i, 30)
alignments[i] = tablewriter.ALIGN_LEFT
} else {
alignments[i] = tablewriter.ALIGN_CENTER
}
}
t.writer.SetHeaderColor(headerColors...)
t.writer.SetColumnAlignment(alignments)
return t
}
func (t *TablePrinter) setFooter() *TablePrinter {
footers := make([]string, t.headerLen)
if t.headerLen > 1 {
footers[len(footers)-2] = "TOTAL"
footers[len(footers)-1] = strconv.Itoa(t.appendCalls)
} else {
footers[0] = "TOTAL: " + strconv.Itoa(t.appendCalls)
}
t.writer.SetFooter(footers)
colors := make([]tablewriter.Colors, t.headerLen)
color := noColor
if t.useColor {
color = colorFooter
}
if t.headerLen > 1 {
colors[len(colors)-2] = color
colors[len(colors)-1] = color
} else {
colors[0] = color
}
t.writer.SetFooterColor(colors...)
return t
}
func (t *TablePrinter) Append(slc []string) {
t.appendCalls++
t.writer.Append(slc)
}