package gust import ( "fmt" "github.com/charmbracelet/bubbles/spinner" tea "github.com/charmbracelet/bubbletea" ) type Status struct { Kind StatusKind Spinner spinner.Model } func NewStatus() Status { return Status{ Kind: Initializing, Spinner: spinner.New(spinner.WithSpinner(spinner.Line)), } } type StatusKind int const ( Initializing StatusKind = iota Success Running Error ) func (s StatusKind) String() string { switch s { case Initializing: return "initializing" case Success: return "success" case Running: return "running" case Error: return "error" default: return "error" } } func (s StatusKind) Cmd() tea.Cmd { return func() tea.Msg { return s } } func (s StatusKind) Style() spinner.Spinner { switch s { case Initializing: return spinner.Dot case Success: return spinner.Jump default: return spinner.Dot } } func (s Status) Init() tea.Cmd { return tea.Batch(Initializing.Cmd(), s.Spinner.Tick) } func (s Status) Update(msg tea.Msg) (Status, tea.Cmd) { switch msg := msg.(type) { case StatusKind: s.Kind = msg s.Spinner.Spinner = s.Kind.Style() return s, nil case spinner.TickMsg: var cmd tea.Cmd s.Spinner, cmd = s.Spinner.Update(msg) return s, cmd } return s, nil } func (s Status) View() string { switch s.Kind { case Initializing: return fmt.Sprintf("initializing %s", s.Spinner.View()) case Success: return fmt.Sprintf("success") case Running: return fmt.Sprintf("running %s", s.Spinner.View()) case Error: return "error" default: return "error" } }