view.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package header
  2. import (
  3. "fmt"
  4. "fbtop/internal/shared"
  5. "charm.land/lipgloss/v2"
  6. )
  7. var (
  8. titleStyle = lipgloss.NewStyle().Bold(true).Foreground(lipgloss.Color("63"))
  9. urlStyle = lipgloss.NewStyle().Faint(true)
  10. okDot = lipgloss.NewStyle().Foreground(lipgloss.Color("42"))
  11. warnDot = lipgloss.NewStyle().Foreground(lipgloss.Color("214"))
  12. errDot = lipgloss.NewStyle().Foreground(lipgloss.Color("196"))
  13. flowStyle = lipgloss.NewStyle().Faint(true)
  14. issueStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("196"))
  15. )
  16. func Render(state shared.State, url string, width int) string {
  17. var status string
  18. if !state.Connected {
  19. status = errDot.Render("✖ Disconnected")
  20. } else {
  21. ps := shared.SummarizePipeline(state.Comps)
  22. if ps.HasErrors {
  23. status = errDot.Render("✖ Pipeline errors")
  24. } else if ps.HasWarnings {
  25. status = warnDot.Render("▲ Warnings")
  26. } else if ps.Flowing {
  27. status = okDot.Render("● Healthy")
  28. } else if ps.InputRec == 0 && ps.OutputRec == 0 {
  29. status = warnDot.Render("○ Idle")
  30. } else {
  31. status = okDot.Render("● Connected")
  32. }
  33. }
  34. title := titleStyle.Render("fluent-bit-top")
  35. urlStr := urlStyle.Render(url)
  36. updated := state.UpdatedAt.Format("15:04:05")
  37. line1 := fmt.Sprintf(" %s %s %s Updated: %s", title, urlStr, status, updated)
  38. // Pipeline flow summary
  39. line2 := ""
  40. if state.Connected {
  41. ps := shared.SummarizePipeline(state.Comps)
  42. inStr := shared.FormatCount(ps.InputRec)
  43. outStr := shared.FormatCount(ps.OutputRec)
  44. line2 = fmt.Sprintf(" Flow: %s → %d comp → %s ", inStr, len(state.Comps), outStr)
  45. if ps.TotalErrors > 0 {
  46. line2 += issueStyle.Render(fmt.Sprintf("errors:%d ", ps.TotalErrors))
  47. }
  48. if ps.TotalRetries > 0 {
  49. line2 += issueStyle.Render(fmt.Sprintf("retries:%d ", ps.TotalRetries))
  50. }
  51. if ps.TotalDropped > 0 {
  52. line2 += issueStyle.Render(fmt.Sprintf("dropped:%d ", ps.TotalDropped))
  53. }
  54. line2 = flowStyle.Render(line2)
  55. }
  56. return lipgloss.NewStyle().Width(width).Render(line1 + "\n" + line2)
  57. }