package tui import ( "fmt" "git.jingrow.com/charmbracelet/bubbles/textinput" tea "git.jingrow.com/charmbracelet/bubbletea" ) // AskInput shows a text input prompt and returns the entered value or empty string if cancelled func AskInput(prompt, placeholder string) (string, error) { ti := textinput.New() ti.Placeholder = placeholder ti.Focus() ti.Width = 40 m := &inputModel{ // Use pointer textInput: ti, prompt: prompt, result: "", } p := tea.NewProgram(m) finalModel, err := p.Run() if err != nil { return "", err } // Cast back to our model type and access result if finalInputModel, ok := finalModel.(*inputModel); ok { return finalInputModel.result, nil } return "", nil } type inputModel struct { textInput textinput.Model prompt string result string } func (m *inputModel) Init() tea.Cmd { // Use pointer receiver return tea.Sequence(tea.EnterAltScreen, textinput.Blink, tea.HideCursor) } func (m *inputModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { // Use pointer receiver var cmd tea.Cmd switch msg := msg.(type) { case tea.KeyMsg: switch msg.Type { case tea.KeyEnter: m.result = m.textInput.Value() fmt.Println("You entered:", m.result) return m, tea.Quit case tea.KeyCtrlQ: return m, tea.Quit } } m.textInput, cmd = m.textInput.Update(msg) return m, cmd } func (m *inputModel) View() string { // Use pointer receiver return fmt.Sprintf( "%s\n\n%s\n\n to submit • to quit", titleStyle.Render(m.prompt), m.textInput.View(), ) }