mirror of
https://github.com/containers/skopeo.git
synced 2025-09-17 23:39:13 +00:00
> go get github.com/containers/image/v5@main > go mod tidy && go mod vendor This updates c/image with a new version of x/exp. That package has changed API in an incompatible way, so just bumping x/exp (as in https://github.com/containers/skopeo/pull/2060 ) would break Skopeo builds. This updates both c/image and x/exp in lockstep (and nothing needs updating in Skopeo itself for the x/exp breakage). Signed-off-by: Miloslav Trmač <mitr@redhat.com>
104 lines
2.3 KiB
Go
104 lines
2.3 KiB
Go
package mpb
|
|
|
|
import (
|
|
"io"
|
|
"strings"
|
|
|
|
"github.com/mattn/go-runewidth"
|
|
"github.com/vbauerster/mpb/v8/decor"
|
|
"github.com/vbauerster/mpb/v8/internal"
|
|
)
|
|
|
|
const (
|
|
positionLeft = 1 + iota
|
|
positionRight
|
|
)
|
|
|
|
var defaultSpinnerStyle = [...]string{"⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"}
|
|
|
|
// SpinnerStyleComposer interface.
|
|
type SpinnerStyleComposer interface {
|
|
BarFillerBuilder
|
|
PositionLeft() SpinnerStyleComposer
|
|
PositionRight() SpinnerStyleComposer
|
|
Meta(func(string) string) SpinnerStyleComposer
|
|
}
|
|
|
|
type sFiller struct {
|
|
frames []string
|
|
count uint
|
|
meta func(string) string
|
|
position func(string, int) string
|
|
}
|
|
|
|
type spinnerStyle struct {
|
|
position uint
|
|
frames []string
|
|
meta func(string) string
|
|
}
|
|
|
|
// SpinnerStyle constructs default spinner style which can be altered via
|
|
// SpinnerStyleComposer interface.
|
|
func SpinnerStyle(frames ...string) SpinnerStyleComposer {
|
|
ss := spinnerStyle{
|
|
meta: func(s string) string { return s },
|
|
}
|
|
if len(frames) != 0 {
|
|
ss.frames = frames
|
|
} else {
|
|
ss.frames = defaultSpinnerStyle[:]
|
|
}
|
|
return ss
|
|
}
|
|
|
|
func (s spinnerStyle) PositionLeft() SpinnerStyleComposer {
|
|
s.position = positionLeft
|
|
return s
|
|
}
|
|
|
|
func (s spinnerStyle) PositionRight() SpinnerStyleComposer {
|
|
s.position = positionRight
|
|
return s
|
|
}
|
|
|
|
func (s spinnerStyle) Meta(fn func(string) string) SpinnerStyleComposer {
|
|
s.meta = fn
|
|
return s
|
|
}
|
|
|
|
func (s spinnerStyle) Build() BarFiller {
|
|
sf := &sFiller{
|
|
frames: s.frames,
|
|
meta: s.meta,
|
|
}
|
|
switch s.position {
|
|
case positionLeft:
|
|
sf.position = func(frame string, padWidth int) string {
|
|
return frame + strings.Repeat(" ", padWidth)
|
|
}
|
|
case positionRight:
|
|
sf.position = func(frame string, padWidth int) string {
|
|
return strings.Repeat(" ", padWidth) + frame
|
|
}
|
|
default:
|
|
sf.position = func(frame string, padWidth int) string {
|
|
return strings.Repeat(" ", padWidth/2) + frame + strings.Repeat(" ", padWidth/2+padWidth%2)
|
|
}
|
|
}
|
|
return sf
|
|
}
|
|
|
|
func (s *sFiller) Fill(w io.Writer, stat decor.Statistics) error {
|
|
width := internal.CheckRequestedWidth(stat.RequestedWidth, stat.AvailableWidth)
|
|
frame := s.frames[s.count%uint(len(s.frames))]
|
|
frameWidth := runewidth.StringWidth(frame)
|
|
s.count++
|
|
|
|
if width < frameWidth {
|
|
return nil
|
|
}
|
|
|
|
_, err := io.WriteString(w, s.position(s.meta(frame), width-frameWidth))
|
|
return err
|
|
}
|