package main import ( "os" "os/exec" "github.com/charmbracelet/bubbles/textinput" tea "github.com/charmbracelet/bubbletea" ) type snippetDetails struct { name string prevName string contents string } type VimFinishedMsg struct { snippet snippetDetails err error } func newItem() tea.Cmd { return editContents("#!/bin/sh", snippetDetails{}) } func editContents(existingContents string, snippet snippetDetails) tea.Cmd { f, _ := os.CreateTemp("", "doe.sh") name := f.Name() f.WriteString(existingContents) f.Close() c := exec.Command("vim", f.Name()) return tea.ExecProcess(c, func(err error) tea.Msg { contents, _ := os.ReadFile(name) snippet.contents = string(contents) return VimFinishedMsg{snippet, err} }) } type detailsModel struct { returnTo tea.Model snippet snippetDetails ti textinput.Model } func (m detailsModel) Init() tea.Cmd { return nil } func (m detailsModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { var cmd tea.Cmd switch msg := msg.(type) { case tea.KeyMsg: switch msg.Type { case tea.KeyEnter: return m, tea.Quit case tea.KeyCtrlC, tea.KeyEsc: return m, tea.Quit } } m.ti, cmd = m.ti.Update(msg) return m, cmd } func (m detailsModel) View() string { out := "Enter snippet name\n" out += m.ti.View() return appStyle.Render(out) } func switchToDetails(returnTo tea.Model, snippet snippetDetails) (tea.Model, tea.Cmd) { ti := textinput.New() ti.Placeholder = "Snippet name" ti.Focus() ti.CharLimit = 250 ti.SetValue(snippet.name) m := detailsModel{returnTo, snippet, ti} return m, m.Init() }