diff options
Diffstat (limited to 'editing.go')
-rw-r--r-- | editing.go | 106 |
1 files changed, 72 insertions, 34 deletions
@@ -8,43 +8,19 @@ import ( tea "github.com/charmbracelet/bubbletea" ) +type detailsModel struct { + returnTo tea.Model + validationMsg string + snippet snippetDetails + ti textinput.Model +} + 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 } @@ -56,9 +32,16 @@ func (m detailsModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case tea.KeyMsg: switch msg.Type { case tea.KeyEnter: - return m, tea.Quit + m.snippet.name = m.ti.Value() + if len(m.snippet.name) == 0 || len(m.snippet.name) > 250 { + m.validationMsg = "Name must be 0-250 characters" + return m, nil + } + + return m.returnTo, tea.Batch(m.returnTo.Init(), saveSnippetCmd(m.snippet)) case tea.KeyCtrlC, tea.KeyEsc: - return m, tea.Quit + // exit without saving + return m.returnTo, m.returnTo.Init() } } m.ti, cmd = m.ti.Update(msg) @@ -67,6 +50,7 @@ func (m detailsModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { func (m detailsModel) View() string { out := "Enter snippet name\n" + out += errorTextStyle.Render(m.validationMsg) + "\n" out += m.ti.View() return appStyle.Render(out) } @@ -78,6 +62,60 @@ func switchToDetails(returnTo tea.Model, snippet snippetDetails) (tea.Model, tea ti.CharLimit = 250 ti.SetValue(snippet.name) - m := detailsModel{returnTo, snippet, ti} + m := detailsModel{returnTo, "", snippet, ti} return m, m.Init() } + +func saveSnippetCmd(snippet snippetDetails) tea.Cmd { + return func() tea.Msg { + err := saveSnippet(snippet) + if err != nil { + panic(err) + } + + return updateListMsg{} + } + +} + +type updateListMsg struct{} + +type vimFinishedMsg struct { + snippet snippetDetails + err error +} + +func newItemCmd() tea.Cmd { + return editContentsCmd("", snippetDetails{}) +} + +func editItemCmd(item item) tea.Cmd { + return editContentsCmd(item.contents, snippetDetails{name: item.title, prevName: item.title, contents: item.contents}) +} + +func deleteItemCmd(item item) tea.Cmd { + return func() tea.Msg { + err := deleteItem(item) + if err != nil { + panic(err) + } + + return updateListMsg{} + } +} + +func editContentsCmd(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} + }) +} |