github.com/grafana/pyroscope@v1.18.0/pkg/util/cli/banner.go (about) 1 package cli 2 3 import ( 4 "io" 5 "strings" 6 7 "github.com/aybabtme/rgbterm" 8 "github.com/fatih/color" 9 ) 10 11 const ( 12 startColor = 0xffd651 13 endColor = 0xf64d3d 14 ) 15 16 func GradientBanner(banner string, w io.Writer) error { 17 if color.NoColor { 18 _, err := w.Write([]byte(banner + "\n")) 19 return err 20 } 21 22 arr := strings.Split(banner, "\n") 23 l := len(arr) 24 for i, line := range arr { 25 if len(line) == 0 { 26 continue 27 } 28 progress := float64(i) / float64(l-1) 29 r := gradient(startColor, endColor, 16, progress) 30 g := gradient(startColor, endColor, 8, progress) 31 b := gradient(startColor, endColor, 0, progress) 32 _, err := w.Write([]byte(rgbterm.FgString(line, r, g, b) + "\n")) 33 if err != nil { 34 return nil 35 } 36 } 37 return nil 38 } 39 40 func gradient(start, end, offset int, progress float64) uint8 { 41 start = (start >> offset) & 0xff 42 end = (end >> offset) & 0xff 43 return uint8(start + int(float64(end-start)*progress)) 44 }