-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprogress.go
More file actions
94 lines (72 loc) · 1.3 KB
/
progress.go
File metadata and controls
94 lines (72 loc) · 1.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package linkchecker
import (
"context"
"fmt"
"io"
"os"
"strconv"
"sync"
"time"
)
type Bar struct {
TotalSteps int
CompletedSteps int
ctx context.Context
cancel context.CancelFunc
mutex sync.RWMutex
output io.Writer
}
type OptionBar func(*Bar) error
func WithOutputBar(output io.Writer) OptionBar {
return func(b *Bar) error {
b.output = output
return nil
}
}
func NewBar(opts ...OptionBar) *Bar {
bar := &Bar{
output: os.Stdout,
}
for _, o := range opts {
o(bar)
}
return bar
}
func (b *Bar) Add() {
b.mutex.Lock()
defer b.mutex.Unlock()
b.TotalSteps++
}
func (b *Bar) Completed() {
b.mutex.Lock()
defer b.mutex.Unlock()
b.CompletedSteps++
}
func (b *Bar) GetPercent() float64 {
b.mutex.RLock()
defer b.mutex.RUnlock()
var result float64
if b.TotalSteps == 0 {
result = 0
} else {
result = 100.0 * float64(b.CompletedSteps) / float64(b.TotalSteps)
}
return result
}
func (b *Bar) Render() {
f := b.GetPercent()
fmt.Fprintf(b.output, "%s%% complete %d / %d\r", strconv.FormatFloat(f, 'f', 1, 64), b.CompletedSteps, b.TotalSteps)
}
// loop for refreshing the progressbar
func (b *Bar) Refresher() {
for {
select {
// case <-b.done:
// return
case <-b.ctx.Done():
return
case <-time.After(100 * time.Millisecond):
b.Render()
}
}
}