205 lines
3.1 KiB
Go
205 lines
3.1 KiB
Go
package utils
|
|
|
|
import (
|
|
"os"
|
|
)
|
|
|
|
const STDIN uint = 0
|
|
const STDOUT uint = 1
|
|
const STDERR uint = 2
|
|
|
|
const (
|
|
NONE = iota
|
|
BLACK
|
|
RED
|
|
GREEN
|
|
BLUE
|
|
BROWN
|
|
// YELLOW
|
|
CYAN
|
|
MAGENTA
|
|
WHITE
|
|
)
|
|
|
|
type TTYContext struct {
|
|
isTTY [3]bool
|
|
}
|
|
|
|
func (self *TTYContext) Init() {
|
|
for i, _ := range self.isTTY {
|
|
self.isTTY[i] = StreamIsTerminal(getStream(uint(i)))
|
|
}
|
|
}
|
|
|
|
func (self *TTYContext) IsTTY(fd uint) bool {
|
|
if fd == STDERR || fd == STDOUT {
|
|
return self.isTTY[fd]
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (self *TTYContext) Clean() {
|
|
for i, _ := range self.isTTY {
|
|
self.isTTY[i] = false
|
|
}
|
|
}
|
|
|
|
func (self *TTYContext) Bold(fd uint) string {
|
|
if self.isTTY[fd] {
|
|
return "\x1b[1m"
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func (self *TTYContext) BoldOff(fd uint) string {
|
|
if self.isTTY[fd] {
|
|
return "\x1b[22m"
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func (self *TTYContext) Underline(fd uint) string {
|
|
if self.isTTY[fd] {
|
|
return "\x1b[4m"
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func (self *TTYContext) UnderlineOff(fd uint) string {
|
|
if self.isTTY[fd] {
|
|
return "\x1b[24m"
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func (self *TTYContext) Italic(fd uint) string {
|
|
if self.isTTY[fd] {
|
|
return "\x1b[3m"
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func (self *TTYContext) ItalicOff(fd uint) string {
|
|
if self.isTTY[fd] {
|
|
return "\x1b[23m"
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func (self *TTYContext) BlackFg(fd uint) string {
|
|
if self.isTTY[fd] {
|
|
return "\x1b[30m"
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func (self *TTYContext) RedFg(fd uint) string {
|
|
if self.isTTY[fd] {
|
|
return "\x1b[31m"
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func (self *TTYContext) GreenFg(fd uint) string {
|
|
if self.isTTY[fd] {
|
|
return "\x1b[32m"
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func (self *TTYContext) BrownFg(fd uint) string {
|
|
if self.isTTY[fd] {
|
|
return "\x1b[33m"
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func (self *TTYContext) BlueFg(fd uint) string {
|
|
if self.isTTY[fd] {
|
|
return "\x1b[34m"
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func (self *TTYContext) MagentaFg(fd uint) string {
|
|
if self.isTTY[fd] {
|
|
return "\x1b[35m"
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func (self *TTYContext) CyanFg(fd uint) string {
|
|
if self.isTTY[fd] {
|
|
return "\x1b[36m"
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func (self *TTYContext) WhiteFg(fd uint) string {
|
|
if self.isTTY[fd] {
|
|
return "\x1b[37m"
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func (self *TTYContext) FgColor(fd uint, n uint) string {
|
|
var color string
|
|
switch n {
|
|
case BLACK:
|
|
color = self.BlackFg(fd)
|
|
case WHITE:
|
|
color = self.WhiteFg(fd)
|
|
case RED:
|
|
color = self.RedFg(fd)
|
|
case GREEN:
|
|
color = self.GreenFg(fd)
|
|
case BLUE:
|
|
color = self.BlueFg(fd)
|
|
case BROWN:
|
|
color = self.BrownFg(fd)
|
|
case CYAN:
|
|
color = self.CyanFg(fd)
|
|
case MAGENTA:
|
|
color = self.MagentaFg(fd)
|
|
}
|
|
return color
|
|
}
|
|
|
|
// func (self *TTYContext) BgColor(fd uint, n int) string {
|
|
// var color string
|
|
// switch n {
|
|
// case BLACK:
|
|
// color = self.BlackBg(fd)
|
|
// case WHITE:
|
|
// color = self.WhiteBg(fd)
|
|
// case RED:
|
|
// color = self.RedBg(fd)
|
|
// case GREEN:
|
|
// color = self.GreenBg(fd)
|
|
// case CYAN:
|
|
// color = self.CyanBg(fd)
|
|
// case MAGENTA:
|
|
// color = self.MagentaBg(fd)
|
|
// }
|
|
// return color
|
|
// }
|
|
|
|
func (self *TTYContext) Reset(fd uint) string {
|
|
if StreamIsTerminal(getStream(fd)) {
|
|
return "\x1b[0m"
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func getStream(fd uint) *os.File {
|
|
var s *os.File = nil
|
|
|
|
switch fd {
|
|
case STDOUT:
|
|
s = os.Stdout
|
|
case STDERR:
|
|
s = os.Stderr
|
|
}
|
|
return s
|
|
}
|