1package gust
2
3import (
4 "fmt"
5
6 "github.com/charmbracelet/bubbles/spinner"
7 tea "github.com/charmbracelet/bubbletea"
8)
9
10type Status struct {
11 Kind StatusKind
12 Spinner spinner.Model
13}
14
15func NewStatus() Status {
16 return Status{
17 Kind: Initializing,
18 Spinner: spinner.New(spinner.WithSpinner(spinner.Line)),
19 }
20}
21
22type StatusKind int
23
24const (
25 Initializing StatusKind = iota
26 Success
27 Running
28 Error
29)
30
31func (s StatusKind) String() string {
32 switch s {
33 case Initializing:
34 return "initializing"
35 case Success:
36 return "success"
37 case Running:
38 return "running"
39 case Error:
40 return "error"
41 default:
42 return "error"
43 }
44}
45
46func (s StatusKind) Cmd() tea.Cmd {
47 return func() tea.Msg {
48 return s
49 }
50}
51
52func (s StatusKind) Style() spinner.Spinner {
53 switch s {
54 case Initializing:
55 return spinner.Dot
56 case Success:
57 return spinner.Jump
58 default:
59 return spinner.Dot
60 }
61}
62
63func (s Status) Init() tea.Cmd {
64 return tea.Batch(Initializing.Cmd(), s.Spinner.Tick)
65}
66
67func (s Status) Update(msg tea.Msg) (Status, tea.Cmd) {
68 switch msg := msg.(type) {
69 case StatusKind:
70 s.Kind = msg
71 s.Spinner.Spinner = s.Kind.Style()
72 return s, nil
73 case spinner.TickMsg:
74 var cmd tea.Cmd
75 s.Spinner, cmd = s.Spinner.Update(msg)
76 return s, cmd
77 }
78
79 return s, nil
80}
81
82func (s Status) View() string {
83 switch s.Kind {
84 case Initializing:
85 return fmt.Sprintf("initializing %s", s.Spinner.View())
86 case Success:
87 return fmt.Sprintf("success")
88 case Running:
89 return fmt.Sprintf("running %s", s.Spinner.View())
90 case Error:
91 return "error"
92 default:
93 return "error"
94 }
95}