forked from cloudfoundry/cli
-
Notifications
You must be signed in to change notification settings - Fork 0
/
color.go
144 lines (113 loc) · 3.08 KB
/
color.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
package terminal
import (
"os"
"regexp"
"github.com/fatih/color"
"golang.org/x/crypto/ssh/terminal"
)
const (
red color.Attribute = color.FgRed
green = color.FgGreen
yellow = color.FgYellow
magenta = color.FgMagenta
cyan = color.FgCyan
grey = color.FgWhite
defaultFgColor = 38
)
var (
colorize func(message string, textColor color.Attribute, bold int) string
TerminalSupportsColors = isTerminal()
UserAskedForColors = ""
)
func init() {
InitColorSupport()
}
func InitColorSupport() {
if colorsEnabled() {
colorize = func(message string, textColor color.Attribute, bold int) string {
colorPrinter := color.New(textColor)
if bold == 1 {
colorPrinter = colorPrinter.Add(color.Bold)
}
f := colorPrinter.SprintFunc()
return f(message)
}
} else {
colorize = func(message string, _ color.Attribute, _ int) string {
return message
}
}
}
func colorsEnabled() bool {
if os.Getenv("CF_COLOR") == "true" {
return true
}
if os.Getenv("CF_COLOR") == "false" {
return false
}
if UserAskedForColors == "true" {
return true
}
return UserAskedForColors != "false" && TerminalSupportsColors
}
func Colorize(message string, textColor color.Attribute) string {
return colorize(message, textColor, 0)
}
func ColorizeBold(message string, textColor color.Attribute) string {
return colorize(message, textColor, 1)
}
var decolorizerRegex = regexp.MustCompile(`\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]`)
func Decolorize(message string) string {
return string(decolorizerRegex.ReplaceAll([]byte(message), []byte("")))
}
func HeaderColor(message string) string {
return ColorizeBold(message, defaultFgColor)
}
func CommandColor(message string) string {
return ColorizeBold(message, yellow)
}
func StoppedColor(message string) string {
return ColorizeBold(message, grey)
}
func AdvisoryColor(message string) string {
return ColorizeBold(message, yellow)
}
func CrashedColor(message string) string {
return ColorizeBold(message, red)
}
func FailureColor(message string) string {
return ColorizeBold(message, red)
}
func SuccessColor(message string) string {
return ColorizeBold(message, green)
}
func EntityNameColor(message string) string {
return ColorizeBold(message, cyan)
}
func PromptColor(message string) string {
return ColorizeBold(message, cyan)
}
func TableContentHeaderColor(message string) string {
return ColorizeBold(message, cyan)
}
func WarningColor(message string) string {
return ColorizeBold(message, magenta)
}
func LogStdoutColor(message string) string {
return message
}
func LogStderrColor(message string) string {
return Colorize(message, red)
}
func LogHealthHeaderColor(message string) string {
return Colorize(message, grey)
}
func LogAppHeaderColor(message string) string {
return ColorizeBold(message, yellow)
}
func LogSysHeaderColor(message string) string {
return ColorizeBold(message, cyan)
}
func isTerminal() bool {
return terminal.IsTerminal(int(os.Stdout.Fd()))
}