package main import ( "fmt" "strings" "github.com/fatih/color" ) var colorCache = map[string]*color.Color{} func makeColor(colorSpec string) (c *color.Color) { // caching if c, ok := colorCache[colorSpec]; ok { return c } defer func() { colorCache[colorSpec] = c }() splits := strings.Split(colorSpec, ",") name := strings.TrimSpace(splits[0]) c = color.New() switch name { case "black": c.Add(color.FgBlack) case "red": c.Add(color.FgRed) case "green": c.Add(color.FgGreen) case "yellow": c.Add(color.FgYellow) case "blue": c.Add(color.FgBlue) case "magenta": c.Add(color.FgMagenta) case "cyan": c.Add(color.FgCyan) case "white": c.Add(color.FgWhite) case "": default: panic("unknown color name. valid color names: black, red, green, yellow, blue, magenta, cyan, white") } if len(splits) >= 2 { attr := splits[1] switch attr { case "bold": fmt.Println("bold") c.Add(color.Bold) case "faint": fmt.Println("faint") c.Add(color.Faint) case "italic": fmt.Println("italic") c.Add(color.Italic) case "underline": fmt.Println("underline") c.Add(color.Underline) case "blink_slow": fmt.Println("blink_slow") c.Add(color.BlinkSlow) case "blink_rapid": fmt.Println("blink_rapid") c.Add(color.BlinkRapid) case "reverse_video": fmt.Println("reverse_video") c.Add(color.ReverseVideo) case "concealed": fmt.Println("concealed") c.Add(color.Concealed) case "crossed_out": fmt.Println("crossed_out") c.Add(color.CrossedOut) case "": fmt.Println("") default: panic("unknown attribute. valid attributes: bold, faint, italic, underline, blink_slow, blink_rapid, reverse_video, concealed, crossed_out") } } return c }