/
progress_bar.go
65 lines (54 loc) · 1.57 KB
/
progress_bar.go
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
// Copyright 2023 VMware, Inc.
// SPDX-License-Identifier: BSD-2-Clause
package internal
import (
"fmt"
"io"
"time"
"github.com/schollz/progressbar/v3"
)
//go:generate counterfeiter . ProgressBar
type ProgressBar interface {
WrapWriter(source io.Writer) io.Writer
WrapReader(source io.Reader) io.Reader
}
//go:generate counterfeiter . ProgressBarMaker
type ProgressBarMaker func(description string, length int64, output io.Writer) ProgressBar
var MakeProgressBar = NewProgressBar
func NewProgressBar(description string, length int64, output io.Writer) ProgressBar {
return &ProgressBarImpl{
description: description,
length: length,
output: output,
}
}
type ProgressBarImpl struct {
description string
length int64
output io.Writer
}
func (b *ProgressBarImpl) makeProgressBar() *progressbar.ProgressBar {
bar := progressbar.NewOptions64(
b.length,
progressbar.OptionSetDescription(b.description),
progressbar.OptionSetWriter(b.output),
progressbar.OptionShowBytes(true),
progressbar.OptionSetWidth(10),
progressbar.OptionThrottle(65*time.Millisecond),
progressbar.OptionShowCount(),
progressbar.OptionOnCompletion(func() {
_, _ = fmt.Fprintln(b.output, "")
}),
progressbar.OptionSpinnerType(14),
progressbar.OptionFullWidth(),
)
_ = bar.RenderBlank()
return bar
}
func (b *ProgressBarImpl) WrapWriter(source io.Writer) io.Writer {
return io.MultiWriter(source, b.makeProgressBar())
}
func (b *ProgressBarImpl) WrapReader(source io.Reader) io.Reader {
reader := progressbar.NewReader(source, b.makeProgressBar())
return &reader
}