view.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package diagview
  2. import (
  3. "fmt"
  4. "strings"
  5. "fbtop/internal/shared"
  6. "charm.land/lipgloss/v2"
  7. )
  8. var (
  9. errorStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("196")).Bold(true)
  10. warningStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("214"))
  11. idleStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("245"))
  12. okStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("42"))
  13. panelStyle = lipgloss.NewStyle().Border(lipgloss.NormalBorder(), true).Padding(0, 1)
  14. titleStyle = lipgloss.NewStyle().Bold(true)
  15. hintStyle = lipgloss.NewStyle().Faint(true).Italic(true)
  16. )
  17. func Render(diags []shared.Diag, width int) string {
  18. if len(diags) == 0 {
  19. ok := okStyle.Render("● No issues detected — pipeline is healthy")
  20. return panelStyle.Width(width - 2).Render(
  21. titleStyle.Render("Diagnostics") + "\n" + ok,
  22. )
  23. }
  24. var b strings.Builder
  25. b.WriteString(titleStyle.Render("Diagnostics"))
  26. b.WriteString("\n")
  27. for _, d := range diags {
  28. var badge string
  29. switch d.Level {
  30. case shared.HealthError:
  31. badge = errorStyle.Render("✖ ERROR")
  32. case shared.HealthWarning:
  33. badge = warningStyle.Render("▲ WARN ")
  34. case shared.HealthIdle:
  35. badge = idleStyle.Render("○ IDLE ")
  36. default:
  37. badge = " OK "
  38. }
  39. comp := ""
  40. if d.CompID != "" {
  41. comp = fmt.Sprintf(" [%s]", d.CompID)
  42. }
  43. b.WriteString(fmt.Sprintf(" %s %s%s\n", badge, d.Message, comp))
  44. if d.Hint != "" {
  45. b.WriteString(fmt.Sprintf(" %s\n", hintStyle.Render("💡 "+d.Hint)))
  46. }
  47. }
  48. return panelStyle.Width(width - 2).Render(b.String())
  49. }