open-consul/command/cli/formatting.go
Nitya Dhanushkodi d3591b687a
troubleshoot: make output have tables and colors (#16235)
Adds tables and colors using libraries used in consul-k8s. It doesn't add the full `terminal` UI package that consul-k8s uses since there is an existing UI in Consul that I didn't want to affect too much. So instead this adds to the existing UI.
2023-02-10 11:12:13 -08:00

89 lines
1.9 KiB
Go

package cli
import (
"github.com/fatih/color"
"github.com/olekukonko/tablewriter"
)
// Functions to set up colorized output.
const (
noColor = -1
)
func colorize(message string, uc UiColor) string {
if uc.Code == noColor {
return message
}
attr := []color.Attribute{color.Attribute(uc.Code)}
if uc.Bold {
attr = append(attr, color.Bold)
}
return color.New(attr...).SprintFunc()(message)
}
// UiColor is a posix shell color code to use.
type UiColor struct {
Code int
Bold bool
}
// A list of colors that are useful. These are all non-bolded by default.
var (
UiColorNone UiColor = UiColor{noColor, false}
UiColorRed = UiColor{int(color.FgHiRed), false}
UiColorGreen = UiColor{int(color.FgHiGreen), false}
UiColorYellow = UiColor{int(color.FgHiYellow), false}
UiColorBlue = UiColor{int(color.FgHiBlue), false}
UiColorMagenta = UiColor{int(color.FgHiMagenta), false}
UiColorCyan = UiColor{int(color.FgHiCyan), false}
)
// Functions that are useful for table output.
const (
Yellow = "yellow"
Green = "green"
Red = "red"
)
var colorMapping = map[string]int{
Green: tablewriter.FgGreenColor,
Yellow: tablewriter.FgYellowColor,
Red: tablewriter.FgRedColor,
}
// Table is passed to UI.Table to provide a nicely formatted table.
type Table struct {
Headers []string
Rows [][]Cell
}
// Cell is a single entry for a table.
type Cell struct {
Value string
Color string
}
// NewTable creates a new Table structure that can be used with UI.Table.
func NewTable(headers ...string) *Table {
return &Table{
Headers: headers,
}
}
// AddRow adds a row to the table.
func (t *Table) AddRow(cols []string, colors []string) {
var row []Cell
for i, col := range cols {
if i < len(colors) {
row = append(row, Cell{Value: col, Color: colors[i]})
} else {
row = append(row, Cell{Value: col})
}
}
t.Rows = append(t.Rows, row)
}