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  }