111 lines
2.1 KiB
Go
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)
|
|
}
|