package app import ( "fmt" "strconv" "strings" ) // formatBytes converts bytes to human readable format func formatBytes(bytes int64) string { if bytes == 0 { return "0 B" } units := []string{"B", "KB", "MB", "GB", "TB", "PB"} var i int value := float64(bytes) for value >= 1024 && i < len(units)-1 { value /= 1024 i++ } if i == 0 { return fmt.Sprintf("%.0f %s", value, units[i]) } return fmt.Sprintf("%.1f %s", value, units[i]) } // formatNumber formats large numbers with commas func formatNumber(num int64) string { if num == 0 { return "0" } str := strconv.FormatInt(num, 10) result := "" for i, char := range str { if i > 0 && (len(str)-i)%3 == 0 { result += "," } result += string(char) } return result } // calculatePercent calculates percentage for progress bars func calculatePercent(current, max int) int { if max == 0 { return 0 } return (current * 100) / max } func pluginLaneDisplayName(lane string) string { normalized := strings.TrimSpace(strings.ToLower(lane)) if normalized == "" || normalized == "default" { return "Default" } parts := strings.Fields(strings.ReplaceAll(normalized, "_", " ")) if len(parts) == 0 { return "Default" } for i, part := range parts { if part == "" { continue } parts[i] = strings.ToUpper(part[:1]) + part[1:] } return strings.Join(parts, " ") } func pluginLaneTitle(lane string) string { return pluginLaneDisplayName(lane) + " Workers" } func pluginLaneDescription(lane string) string { switch strings.TrimSpace(strings.ToLower(lane)) { case "iceberg": return "Iceberg maintenance workers, scheduler state, queue, and execution flows." case "lifecycle": return "Lifecycle workers, scheduler state, queue, and execution flows." default: return "Default workers, scheduler state, queue, and execution flows." } }