blob: d8a7d292992401c16f513b57a80f99868a21569e [file] [log] [blame]
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
import (
"math/bits"
"os"
"strconv"
"golang.org/x/term"
)
func canColor() bool {
if os.Getenv("TERM") == "" || os.Getenv("TERM") == "dumb" {
return false
}
if !term.IsTerminal(1) {
return false
}
return true
}
type colorizer struct {
enabled bool
}
func newColorizer(enabled bool) *colorizer {
return &colorizer{enabled}
}
type colorFlags uint64
const (
colorBold colorFlags = 1 << 1
colorFgBlack = 1 << 30
colorFgRed = 1 << 31
colorFgGreen = 1 << 32
colorFgYellow = 1 << 33
colorFgBlue = 1 << 34
colorFgMagenta = 1 << 35
colorFgCyan = 1 << 36
colorFgWhite = 1 << 37
)
func (c colorizer) color(s string, f colorFlags) string {
if !c.enabled || f == 0 {
return s
}
pfx := make([]byte, 0, 16)
pfx = append(pfx, 0x1b, '[')
for f != 0 {
flag := uint64(bits.TrailingZeros64(uint64(f)))
f &^= 1 << flag
if len(pfx) > 2 {
pfx = append(pfx, ';')
}
pfx = strconv.AppendUint(pfx, flag, 10)
}
pfx = append(pfx, 'm')
return string(pfx) + s + "\x1b[0m"
}