aboutsummaryrefslogtreecommitdiffstats
path: root/client/go/util/spinner.go
diff options
context:
space:
mode:
Diffstat (limited to 'client/go/util/spinner.go')
-rw-r--r--client/go/util/spinner.go63
1 files changed, 63 insertions, 0 deletions
diff --git a/client/go/util/spinner.go b/client/go/util/spinner.go
new file mode 100644
index 00000000000..1deb4296d28
--- /dev/null
+++ b/client/go/util/spinner.go
@@ -0,0 +1,63 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+package util
+
+import (
+ "os"
+ "time"
+
+ "github.com/briandowns/spinner"
+ "github.com/pkg/errors"
+)
+
+const (
+ spinnerTextEllipsis = "..."
+ spinnerTextDone = "done"
+ spinnerTextFailed = "failed"
+ spinnerColor = "blue"
+)
+
+var messages = os.Stderr
+
+func Spinner(text string, fn func() error) error {
+ initialMsg := text + spinnerTextEllipsis + " "
+ doneMsg := initialMsg + spinnerTextDone + "\n"
+ failMsg := initialMsg + spinnerTextFailed + "\n"
+
+ return loading(initialMsg, doneMsg, failMsg, fn)
+}
+
+func loading(initialMsg, doneMsg, failMsg string, fn func() error) error {
+ done := make(chan struct{})
+ errc := make(chan error)
+ go func() {
+ defer close(done)
+
+ s := spinner.New(spinner.CharSets[11], 100*time.Millisecond, spinner.WithWriter(messages))
+ s.Prefix = initialMsg
+ s.FinalMSG = doneMsg
+ s.HideCursor = true
+ s.Writer = messages
+
+ if err := s.Color(spinnerColor); err != nil {
+ panic(Error(err, "failed setting spinner color"))
+ }
+
+ s.Start()
+ err := <-errc
+ if err != nil {
+ s.FinalMSG = failMsg
+ }
+
+ s.Stop()
+ }()
+
+ err := fn()
+ errc <- err
+ <-done
+ return err
+}
+
+func Error(e error, message string) error {
+ return errors.Wrap(e, message)
+}