summaryrefslogtreecommitdiffstats
path: root/progress.go
diff options
context:
space:
mode:
authorRose Hogenson <rosehogenson@posteo.net>2025-04-06 14:37:44 -0700
committerRose Hogenson <rosehogenson@posteo.net>2025-04-06 14:37:44 -0700
commit2949987666d8b104ea305734fe5e159d97434240 (patch)
tree9adab4dc76c390dec88ffd76b79d4155b12964bb /progress.go
parentFix terminal resize (diff)
downloadprogress-bar-2949987666d8b104ea305734fe5e159d97434240.tar.zst
Bubbletea to make it pretty
Diffstat (limited to 'progress.go')
-rw-r--r--progress.go90
1 files changed, 0 insertions, 90 deletions
diff --git a/progress.go b/progress.go
deleted file mode 100644
index 3a638ed..0000000
--- a/progress.go
+++ /dev/null
@@ -1,90 +0,0 @@
-// Package progress implements a simple command line progress bar.
-//
-// Example:
-//
-// import (
-// time"
-//
-// "gitlab.com/rhogenson/progress-bar"
-// )
-//
-// func main() {
-// b := progress.New(100)
-// for i := range 100 {
-// b.Set(i)
-// b.Print()
-// time.Sleep(time.Second)
-// }
-// }
-package progress
-
-import (
- "fmt"
- "os"
- "strings"
- "time"
-
- "gitlab.com/rhogenson/deque"
- "golang.org/x/term"
-)
-
-type measurement struct {
- t time.Time
- i int
-}
-
-// Bar is a progess bar.
-type Bar struct {
- max int
- measurements deque.Deque[measurement]
- secondPrint bool
-}
-
-func New(max int) *Bar {
- return &Bar{max: max}
-}
-
-// Set sets the current value to val.
-func (b *Bar) Set(val int) {
- // Measurements must be strictly increasing
- if b.measurements.Len() > 0 && b.measurements.At(b.measurements.Len()-1).i > val {
- b.measurements.Reset()
- }
- b.measurements.PushBack(measurement{time.Now(), val})
-}
-
-// Print shows the progress bar on standard error.
-func (b *Bar) Print() {
- if b.measurements.Len() == 0 {
- return
- }
-
- now := time.Now()
- for b.measurements.Len() > 2 && now.Sub(b.measurements.At(0).t) > 2*time.Minute {
- b.measurements.PopFront()
- }
- first := b.measurements.At(0)
- last := b.measurements.At(b.measurements.Len() - 1)
- deltaT := last.t.Sub(first.t)
- delta := last.i - first.i
- eta := time.Duration(-1)
- if delta != 0 {
- eta = time.Duration(float64(b.max-last.i) / float64(delta) * float64(deltaT))
- }
-
- if b.secondPrint {
- fmt.Fprint(os.Stderr, "\033[2F\033[J")
- }
- b.secondPrint = true
- if cols, _, err := term.GetSize(int(os.Stderr.Fd())); err != nil {
- fmt.Fprintf(os.Stderr, "Unable to determine terminal size: %s\n", err)
- } else {
- p := last.i * cols / b.max
- fmt.Fprintf(os.Stderr, "%s>\n", strings.Repeat("=", max(p-1, 0)))
- }
- if eta < 0 {
- fmt.Fprintln(os.Stderr, "ETA: calculating...")
- } else {
- fmt.Fprintf(os.Stderr, "ETA: %s\n", eta.Round(time.Second))
- }
-}