Dead simple but yet extensible status bar for displaying interactive progress for the shell-based tools, written in Go-lang.
package main
import (
"fmt""math/rand""os""sync""sync/atomic""time""github.com/reconquest/barely""github.com/reconquest/loreley"
)
funcmain() {
format, err:=loreley.CompileWithReset(
` {bg 2}{fg 15}{bold} {.Mode} `+`{bg 253}{fg 0} `+`{if .Updated}{fg 70}{end}{.Done}{fg 0}/{.Total} `,
nil,
)
iferr!=nil {
panic(err)
}
var (
bar=barely.NewStatusBar(format.Template)
wg= sync.WaitGroup{}
status=&struct {
ModestringTotalintDoneint64Updatedint64
}{
Mode: "PROCESSING",
Total: 100,
}
)
bar.SetStatus(status)
bar.Render(os.Stderr)
fori:=1; i<=status.Total; i++ {
wg.Add(1)
gofunc(iint) {
sleep:=time.Duration(rand.Intn(i)) *time.Millisecond*300time.Sleep(sleep)
atomic.AddInt64(&status.Done, 1)
atomic.AddInt64(&status.Updated, 1)
ifi%10==0 {
bar.Clear(os.Stderr)
fmt.Printf("go-routine %d done (%s sleep)\n", i, sleep)
}
bar.Render(os.Stderr)
wg.Done()
<-time.After(time.Millisecond*500)
atomic.AddInt64(&status.Updated, -1)
bar.Render(os.Stderr)
}(i)
}
wg.Wait()
bar.Clear(os.Stderr)
}