diff --git a/cli/spin/spin.go b/cli/spin/spin.go new file mode 100644 index 0000000..33fb10f --- /dev/null +++ b/cli/spin/spin.go @@ -0,0 +1,58 @@ +package spin + +import ( + "context" + "fmt" + + "github.com/charmbracelet/bubbles/spinner" + tea "github.com/charmbracelet/bubbletea" +) + +type model struct { + spinner spinner.Model + text string + quitting bool + err error +} + +type errMsg error + +func newModel(text string) model { + s := spinner.New() + s.Spinner = spinner.Dot + return model{spinner: s, text: text} +} + +func (m model) Init() tea.Cmd { + return m.spinner.Tick +} + +func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + switch msg := msg.(type) { + case errMsg: + m.err = msg + return m, nil + + default: + var cmd tea.Cmd + m.spinner, cmd = m.spinner.Update(msg) + return m, cmd + } +} + +func (m model) View() string { + if m.err != nil { + return m.err.Error() + } + str := fmt.Sprintf("%s %s\n", m.spinner.View(), m.text) + if m.quitting { + return str + "\n" + } + return str +} + +func Spin(ctx context.Context, message string) error { + p := tea.NewProgram(newModel(message), tea.WithContext(ctx)) + _, err := p.Run() + return err +}