mirror of
https://github.com/strongdm/comply
synced 2024-08-28 18:13:33 +00:00
109 lines
2.1 KiB
Go
109 lines
2.1 KiB
Go
|
package promptui
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"strconv"
|
||
|
"strings"
|
||
|
"text/template"
|
||
|
)
|
||
|
|
||
|
const esc = "\033["
|
||
|
|
||
|
type attribute int
|
||
|
|
||
|
// Foreground weight/decoration attributes.
|
||
|
const (
|
||
|
reset attribute = iota
|
||
|
|
||
|
FGBold
|
||
|
FGFaint
|
||
|
FGItalic
|
||
|
FGUnderline
|
||
|
)
|
||
|
|
||
|
// Foreground color attributes
|
||
|
const (
|
||
|
FGBlack attribute = iota + 30
|
||
|
FGRed
|
||
|
FGGreen
|
||
|
FGYellow
|
||
|
FGBlue
|
||
|
FGMagenta
|
||
|
FGCyan
|
||
|
FGWhite
|
||
|
)
|
||
|
|
||
|
// Background color attributes
|
||
|
const (
|
||
|
BGBlack attribute = iota + 40
|
||
|
BGRed
|
||
|
BGGreen
|
||
|
BGYellow
|
||
|
BGBlue
|
||
|
BGMagenta
|
||
|
BGCyan
|
||
|
BGWhite
|
||
|
)
|
||
|
|
||
|
// ResetCode is the character code used to reset the terminal formatting
|
||
|
var ResetCode = fmt.Sprintf("%s%dm", esc, reset)
|
||
|
|
||
|
const (
|
||
|
hideCursor = esc + "?25l"
|
||
|
showCursor = esc + "?25h"
|
||
|
clearLine = esc + "2K"
|
||
|
)
|
||
|
|
||
|
// FuncMap defines template helpers for the output. It can be extended as a
|
||
|
// regular map.
|
||
|
var FuncMap = template.FuncMap{
|
||
|
"black": Styler(FGBlack),
|
||
|
"red": Styler(FGRed),
|
||
|
"green": Styler(FGGreen),
|
||
|
"yellow": Styler(FGYellow),
|
||
|
"blue": Styler(FGBlue),
|
||
|
"magenta": Styler(FGMagenta),
|
||
|
"cyan": Styler(FGCyan),
|
||
|
"white": Styler(FGWhite),
|
||
|
"bgBlack": Styler(BGBlack),
|
||
|
"bgRed": Styler(BGRed),
|
||
|
"bgGreen": Styler(BGGreen),
|
||
|
"bgYellow": Styler(BGYellow),
|
||
|
"bgBlue": Styler(BGBlue),
|
||
|
"bgMagenta": Styler(BGMagenta),
|
||
|
"bgCyan": Styler(BGCyan),
|
||
|
"bgWhite": Styler(BGWhite),
|
||
|
"bold": Styler(FGBold),
|
||
|
"faint": Styler(FGFaint),
|
||
|
"italic": Styler(FGItalic),
|
||
|
"underline": Styler(FGUnderline),
|
||
|
}
|
||
|
|
||
|
func upLine(n uint) string {
|
||
|
return movementCode(n, 'A')
|
||
|
}
|
||
|
|
||
|
func movementCode(n uint, code rune) string {
|
||
|
return esc + strconv.FormatUint(uint64(n), 10) + string(code)
|
||
|
}
|
||
|
|
||
|
// Styler returns a func that applies the attributes given in the Styler call
|
||
|
// to the provided string.
|
||
|
func Styler(attrs ...attribute) func(interface{}) string {
|
||
|
attrstrs := make([]string, len(attrs))
|
||
|
for i, v := range attrs {
|
||
|
attrstrs[i] = strconv.Itoa(int(v))
|
||
|
}
|
||
|
|
||
|
seq := strings.Join(attrstrs, ";")
|
||
|
|
||
|
return func(v interface{}) string {
|
||
|
end := ""
|
||
|
s, ok := v.(string)
|
||
|
if !ok || !strings.HasSuffix(s, ResetCode) {
|
||
|
end = ResetCode
|
||
|
}
|
||
|
return fmt.Sprintf("%s%sm%v%s", esc, seq, v, end)
|
||
|
}
|
||
|
}
|