types.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package tui
  2. import (
  3. "pingo/internal/ping"
  4. "time"
  5. )
  6. type Address struct {
  7. Address string
  8. results []float64
  9. max_results int
  10. }
  11. func (a *Address) Truncate() (truncated bool) {
  12. if len(a.results) > a.max_results {
  13. a.results = a.results[1:len(a.results)] // return modified slice missing first index
  14. return true
  15. }
  16. return false
  17. }
  18. // Wraps [ping.Ping]
  19. func (a *Address) Ping() (delay float64, err error) {
  20. return ping.Ping(a.Address)
  21. }
  22. // Poll pings the affiliated Address and appends it to a.results
  23. func (a *Address) Poll() (success bool, err error) {
  24. if delay, err := a.Ping(); err == nil {
  25. a.results = append(a.results, delay)
  26. a.Truncate() // enforce max length
  27. return true, nil
  28. } else {
  29. a.results = append(a.results, delay)
  30. a.Truncate() // enforce max length
  31. return false, err
  32. }
  33. }
  34. // Last returns the last result in [Address.results]. Returns -1 if no previous result
  35. func (a *Address) Last() (delay float64) {
  36. if len(a.results) > 0 {
  37. return a.results[len(a.results)-1]
  38. } else {
  39. return -1
  40. }
  41. }
  42. type tickMsg time.Time
  43. // A simple boolean flag sent when the program is ready to poll addresses
  44. type pollMsg bool
  45. // / A simple error message binding to conform to type [tea.Cmd]
  46. type errMsg struct{ err error }
  47. func (e errMsg) Error() string { return e.err.Error() }