// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
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 )
}