package color import ( "fmt" "strconv" "strings" ) // Color defines a custom color object which is defined by SGR parameters. type Color struct { Attrs []Attribute } // Attribute defines a single SGR Code type Attribute int const escape = "\x1b" // Logger attributes const ( Reset Attribute = iota Bold Faint Italic Underline BlinkSlow BlinkRapid ReverseVideo Concealed CrossedOut ) // Foreground text colors const ( FgBlack Attribute = iota + 30 FgRed FgGreen FgYellow FgBlue FgMagenta FgCyan FgWhite ) // Foreground Hi-Intensity text colors const ( FgHiBlack Attribute = iota + 90 FgHiRed FgHiGreen FgHiYellow FgHiBlue FgHiMagenta FgHiCyan FgHiWhite ) // Background text colors const ( BgBlack Attribute = iota + 40 BgRed BgGreen BgYellow BgBlue BgMagenta BgCyan BgWhite ) // Background Hi-Intensity text colors const ( BgHiBlack Attribute = iota + 100 BgHiRed BgHiGreen BgHiYellow BgHiBlue BgHiMagenta BgHiCyan BgHiWhite ) // New returns a new Color with attrs Attributes func New(attrs ...Attribute) *Color { return &Color{Attrs: attrs} } // Add adds new Attributes to a Color func (c *Color) Add(attrs ...Attribute) { for _, attr := range attrs { has := false for _, att := range c.Attrs { if attr == att { has = true break } } if !has { c.Attrs = append(c.Attrs, attr) } } } // String returns a string representation of the sum of a Color's Attributes func (c *Color) String() string { attrs := 0 for _, attr := range c.Attrs { attrs += int(attr) } return fmt.Sprintf("%d", attrs) } func (c *Color) sequence() string { format := make([]string, len(c.Attrs)) for i, v := range c.Attrs { format[i] = strconv.Itoa(int(v)) } return strings.Join(format, ";") } func (c *Color) wrap(s string) string { return c.format() + s + c.unformat() } func (c *Color) format() string { return fmt.Sprintf("%s[%sm", escape, c.sequence()) } func (c *Color) unformat() string { return fmt.Sprintf("%s[%dm", escape, Reset) } func (c *Color) Format(text string) string { if len(c.Attrs) > 0 { return c.wrap(text) } return text } // ParseLevel parses a string and returns a Beaver Level's Color, defaulting to Info func ParseLevel(level string) *Color { switch strings.ToUpper(level) { case "T", "TRACE": return Trace case "D", "DEBUG": return Debug case "I", "INFO": return Info case "W", "WARN": return Warn case "E", "ERROR": return Error case "F", "FATAL": return Fatal } return Info } var ( Trace = New(Bold, FgCyan) Debug = New(Bold, FgBlue) Info = New(Bold, FgGreen) Warn = New(Bold, FgYellow) Error = New(Bold, FgRed) Fatal = New(Bold, BgRed) Default = New() Time = Default Stack = Default )