✨ 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