Ctrl K
ComunidadGuías…

utils/format.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package utils

import (
	"fmt"
	"math"
	"strings"

	"github.com/coroot/coroot/timeseries"
	"github.com/dustin/go-humanize"
	"github.com/dustin/go-humanize/english"
	"github.com/hako/durafmt"
)

var (
	shortDurations, _ = durafmt.DefaultUnitsCoder.Decode("y:y,w:w,d:d,h:h,m:m,s:s,ms:ms,µs:µs")
)

func FormatFloat(v float32) string {
	switch {
	case timeseries.IsNaN(v):
		return ""
	case v == 0:
		return "0"
	case v >= 1:
		return fmt.Sprintf("%.0f", v)
	case v >= 0.1:
		return fmt.Sprintf("%.1f", v)
	case v >= 0.01:
		return fmt.Sprintf("%.2f", v)
	}
	return fmt.Sprintf("%.3f", v)
}

func FormatDuration(d timeseries.Duration, limitFirstN int) string {
	return durafmt.Parse(d.ToStandard()).LimitFirstN(limitFirstN).String()
}
func FormatDurationShort(d timeseries.Duration, limitFirstN int) string {
	return strings.Replace(durafmt.Parse(d.ToStandard()).LimitFirstN(limitFirstN).Format(shortDurations), " ", "", -1)
}

func FormatBytes(v float32) (string, string) {
	base := 1000.0
	sizes := []string{"B", "kB", "MB", "GB", "TB", "PB", "EB"}
	e := math.Floor(math.Log(float64(v)) / math.Log(base))
	if int(e) < 0 || int(e) > len(sizes)-1 {
		return fmt.Sprintf("%.f", v), ""
	}
	unit := sizes[int(e)]
	val := fmt.Sprintf("%.0f", math.Round(float64(v)/math.Pow(base, e)))
	return val, unit
}

func HumanBits(v float32) string {
	if timeseries.IsNaN(v) {
		return ""
	}
	return strings.Replace(humanize.Bytes(uint64(v)), "B", "b", -1) + "ps"
}

func FormatLatency(v float32) string {
	if v < 0.0001 {
		return "<0.1ms"
	}
	if v < 1 {
		return FormatFloat(v*1000) + "ms"
	}
	return FormatFloat(v) + "s"
}

func FormatPercentage(v float32) string {
	return strings.TrimRight(strings.TrimRight(fmt.Sprintf("%.2f", v), "0"), ".") + "%"
}

func FormatMoney(v float32) string {
	s := ""
	switch {
	case v > 0:
		s = "+"
	case v < 0:
		s = "-"
	}
	return fmt.Sprintf("%s$%.2f", s, math.Abs(float64(v)))
}

func LastPart(s string, sep string) string {
	parts := strings.Split(s, sep)
	if len(parts) == 0 {
		return ""
	}
	return parts[len(parts)-1]
}

func FormatLinkStats(requests, latency, bytesSent, bytesReceived float32, issue string) []string {
	if issue != "" {
		return []string{"⚠️ " + issue}
	}
	var res []string
	line := ""
	if !timeseries.IsNaN(requests) {
		line += "📈 " + FormatFloat(requests) + " rps"
	}
	if !timeseries.IsNaN(latency) {
		if len(line) > 0 {
			line += " "
		}
		line += "⏱️ " + FormatLatency(latency)
	}
	if len(line) > 0 {
		res = append(res, line)
	}
	if bytesSent > 0 && bytesReceived > 0 {
		line = ""
		v, u := FormatBytes(bytesSent)
		line += "↑" + v + u + "/s"
		v, u = FormatBytes(bytesReceived)
		line += " ↓" + v + u + "/s"
		res = append(res, line)
	}
	return res
}

func Truncate(s string, maxLen int) string {
	runes := []rune(s)
	if len(runes) <= maxLen {
		return s
	}
	return string(runes[:maxLen]) + "…"
}

func Capitalize(s string) string {
	if len(s) == 0 {
		return ""
	}
	if len(s) == 1 {
		return strings.ToUpper(s)
	}
	return strings.ToUpper(s[0:1]) + s[1:]
}

func PluralWithToBe(quantity int, singular string) string {
	verb := "is"
	if quantity > 1 {
		verb = "are"
	}
	return english.PluralWord(quantity, singular, "") + " " + verb
}