✨ Add cancellable spinner
This commit is contained in:
		
					parent
					
						
							
								c5bc53fb8c
							
						
					
				
			
			
				commit
				
					
						2f08add8ff
					
				
			
		
					 1 changed files with 58 additions and 0 deletions
				
			
		
							
								
								
									
										58
									
								
								cli/spin/spin.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								cli/spin/spin.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -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 | ||||||
|  | } | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue