Prechádzať zdrojové kódy

Implemented basic chart support

arianagiroux 4 týždňov pred
rodič
commit
dd1e22cf10
5 zmenil súbory, kde vykonal 59 pridanie a 22 odobranie
  1. 7 2
      go.mod
  2. 8 2
      go.sum
  3. 25 14
      internal/tui/tui.go
  4. 15 2
      internal/tui/types.go
  5. 4 2
      main.go

+ 7 - 2
go.mod

@@ -2,16 +2,21 @@ module pingo
 
 go 1.25.6
 
-require github.com/charmbracelet/bubbletea v1.3.10
+require (
+	github.com/NimbleMarkets/ntcharts v0.4.0
+	github.com/charmbracelet/bubbletea v1.3.10
+)
 
 require (
 	github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
+	github.com/charmbracelet/bubbles v0.20.0 // indirect
 	github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect
 	github.com/charmbracelet/lipgloss v1.1.0 // indirect
 	github.com/charmbracelet/x/ansi v0.10.1 // indirect
 	github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect
 	github.com/charmbracelet/x/term v0.2.1 // indirect
 	github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect
+	github.com/lrstanley/bubblezone v0.0.0-20240914071701-b48c55a5e78e // indirect
 	github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
 	github.com/mattn/go-isatty v0.0.20 // indirect
 	github.com/mattn/go-localereader v0.0.1 // indirect
@@ -22,5 +27,5 @@ require (
 	github.com/rivo/uniseg v0.4.7 // indirect
 	github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
 	golang.org/x/sys v0.36.0 // indirect
-	golang.org/x/text v0.3.8 // indirect
+	golang.org/x/text v0.20.0 // indirect
 )

+ 8 - 2
go.sum

@@ -1,5 +1,9 @@
+github.com/NimbleMarkets/ntcharts v0.4.0 h1:BtrER5o6s3xMAebhSDQZpdFdfVMGMpV4Qz8lD+Qiw5g=
+github.com/NimbleMarkets/ntcharts v0.4.0/go.mod h1:zVeRqYkh2n59YPe1bflaSL4O2aD2ZemNmrbdEqZ70hk=
 github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
 github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
+github.com/charmbracelet/bubbles v0.20.0 h1:jSZu6qD8cRQ6k9OMfR1WlM+ruM8fkPWkHvQWD9LIutE=
+github.com/charmbracelet/bubbles v0.20.0/go.mod h1:39slydyswPy+uVOHZ5x/GjwVAFkCsV8IIVy+4MhzwwU=
 github.com/charmbracelet/bubbletea v1.3.10 h1:otUDHWMMzQSB0Pkc87rm691KZ3SWa4KUlvF9nRvCICw=
 github.com/charmbracelet/bubbletea v1.3.10/go.mod h1:ORQfo0fk8U+po9VaNvnV95UPWA1BitP1E0N6xJPlHr4=
 github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs=
@@ -14,6 +18,8 @@ github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQ
 github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg=
 github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4=
 github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM=
+github.com/lrstanley/bubblezone v0.0.0-20240914071701-b48c55a5e78e h1:OLwZ8xVaeVrru0xyeuOX+fne0gQTFEGlzfNjipCbxlU=
+github.com/lrstanley/bubblezone v0.0.0-20240914071701-b48c55a5e78e/go.mod h1:NQ34EGeu8FAYGBMDzwhfNJL8YQYoWZP5xYJPRDAwN3E=
 github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
 github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
 github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
@@ -39,5 +45,5 @@ golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k=
 golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
-golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY=
-golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
+golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug=
+golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4=

+ 25 - 14
internal/tui/tui.go

@@ -3,6 +3,7 @@ package tui
 import (
 	"fmt"
 
+	"github.com/NimbleMarkets/ntcharts/linechart/streamlinechart"
 	tea "github.com/charmbracelet/bubbletea"
 )
 
@@ -13,11 +14,12 @@ type Model struct {
 	Addresses []Address // as defined in internal/tui/types.go
 }
 
-func InitialModel(addresses []string) Model {
+func InitialModel(addresses []string, max_results int) Model {
 	var model Model
 	for _, address := range addresses {
 		var addr Address
 		addr.Address = address
+		addr.max_results = max_results
 		model.Addresses = append(model.Addresses, addr)
 	}
 	return model
@@ -43,6 +45,28 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 	return m, m.Poll
 }
 
+func (m Model) View() string {
+	output := "Results:\n\n"
+	for _, address := range m.Addresses {
+		last := address.Last()
+		if last == -1 {
+			output = output + fmt.Sprintf("- %s\tloading...\n\n", address.Address)
+		} else {
+			output = output + fmt.Sprintf("- %s\n\n", address.Address)
+		}
+
+		// Linechart
+		slc := streamlinechart.New(address.max_results, 10)
+		for _, v := range address.results {
+			slc.Push(v)
+		}
+		slc.Draw()
+		output = output + fmt.Sprintf("%s\n\n", slc.View())
+	}
+
+	return output
+}
+
 // A wrapper for the underlying [tui.Address.Poll] function. For each address in
 // [tui.Model.Addresses], run its respective Poll function and update [tui.Model]
 //
@@ -54,16 +78,3 @@ func (m Model) Poll() tea.Msg {
 	}
 	return true
 }
-
-func (m Model) View() string {
-	output := "Results:\n"
-	for _, address := range m.Addresses {
-		last := address.Last()
-		if last == -1 {
-			output = output + fmt.Sprintf("%s: loading...\n", address.Address)
-		} else {
-			output = output + fmt.Sprintf("%s: %f\n", address.Address, last)
-		}
-	}
-	return output
-}

+ 15 - 2
internal/tui/types.go

@@ -3,8 +3,18 @@ package tui
 import "pingo/internal/ping"
 
 type Address struct {
-	Address string
-	results []float64
+	Address     string
+	results     []float64
+	max_results int
+}
+
+func (a *Address) Truncate() (truncated bool) {
+	if len(a.results) > a.max_results {
+		a.results = a.results[1:len(a.results)] // return modified slice missing first index
+		return true
+	}
+
+	return false
 }
 
 // Wraps [ping.Ping]
@@ -16,8 +26,11 @@ func (a *Address) Ping() (delay float64, err error) {
 func (a *Address) Poll() (success bool, err error) {
 	if delay, err := a.Ping(); err == nil {
 		a.results = append(a.results, delay)
+		a.Truncate() // enforce max length
 		return true, nil
 	} else {
+		a.results = append(a.results, delay)
+		a.Truncate() // enforce max length
 		return false, err
 	}
 }

+ 4 - 2
main.go

@@ -9,8 +9,10 @@ import (
 )
 
 func main() {
-	var model = tui.InitialModel([]string{"google.ca", "resolve", "requiem",
-		"grimoire", "bastion"})
+	var model = tui.InitialModel( // TODO(argv) set args via argv
+		[]string{"doesntresolve.comdoasdf", "google.ca"},
+		100,
+	)
 
 	p := tea.NewProgram(model)
 	if _, err := p.Run(); err != nil {