diff --git a/go.mod b/go.mod index 410514e..75d21e2 100644 --- a/go.mod +++ b/go.mod @@ -4,17 +4,15 @@ go 1.13 require ( github.com/charmbracelet/boba v0.6.3 - github.com/charmbracelet/charm v0.5.0 + github.com/charmbracelet/bubbles v0.0.0-20200526000837-87c7cd778f80 + github.com/charmbracelet/bubbletea v0.7.0 + github.com/charmbracelet/charm v0.5.1 github.com/charmbracelet/glamour v0.2.0 - github.com/charmbracelet/tea v0.3.0 - github.com/charmbracelet/teaparty v0.0.0-20200504225426-da64445a0e0d - github.com/dlclark/regexp2 v1.2.0 // indirect github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/muesli/reflow v0.1.0 github.com/muesli/termenv v0.6.0 - github.com/pkg/term v0.0.0-20200520122047-c3ffed290a03 // indirect github.com/spf13/cobra v0.0.7 golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect - golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 + golang.org/x/sys v0.0.0-20200523222454-059865788121 ) diff --git a/go.sum b/go.sum index 4247027..db2b352 100644 --- a/go.sum +++ b/go.sum @@ -15,16 +15,17 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8= github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/charmbracelet/boba v0.6.1/go.mod h1:xqhji08CbPctzbvCi/GzmNvIFOhnWJnkl9N8T65gnK0= github.com/charmbracelet/boba v0.6.3 h1:3YisdYQ35tieYXbfpf8acdVN6d1DJHGKZc5kDJNkjg0= github.com/charmbracelet/boba v0.6.3/go.mod h1:9TUvThAOqjXWYZGOrZ4qyluTrmodxb8SqNR81BJluOU= -github.com/charmbracelet/charm v0.5.0 h1:4GUkDyDOMgzGaTjSB97uyvH5rfxQeDTLPTr9xpKojsQ= -github.com/charmbracelet/charm v0.5.0/go.mod h1:xZgRIZCddA0IAmbsR4zk4HHCj4Z1PLvQcqcZqtk0Pzo= +github.com/charmbracelet/bubbles v0.0.0-20200526000837-87c7cd778f80 h1:cfaoL1+tHPABTLEAg831PIFG96teW69Wamz9M025r5M= +github.com/charmbracelet/bubbles v0.0.0-20200526000837-87c7cd778f80/go.mod h1:/AeLRFlL2Uf4X7U5LjnswTII6u4maPzMm1+vZfeUJKc= +github.com/charmbracelet/bubbletea v0.6.4-0.20200525234836-3b8b011b5a26/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= +github.com/charmbracelet/bubbletea v0.7.0 h1:nf0FEQCCc1e0qRGgpnz08QFsy25eDitzVwxV+Z/p4UI= +github.com/charmbracelet/bubbletea v0.7.0/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= +github.com/charmbracelet/charm v0.5.1 h1:2r6QYeIepEk+wmCXSN4TlotwTF5twlWm87AMGXLahnk= +github.com/charmbracelet/charm v0.5.1/go.mod h1:XBsJjir4zSEMSbbI42JSuyTYQAOcg43bsxe+GUoQHUo= github.com/charmbracelet/glamour v0.2.0 h1:mTgaiNiumpqTZp3qVM6DH9UB0NlbY17wejoMf1kM8Pg= github.com/charmbracelet/glamour v0.2.0/go.mod h1:UA27Kwj3QHialP74iU6C+Gpc8Y7IOAKupeKMLLBURWM= -github.com/charmbracelet/tea v0.2.0/go.mod h1:lADjwO2mMub9qvXSCA9vAkabVWO0HeUrv4uO/lG3C+k= -github.com/charmbracelet/tea v0.3.0/go.mod h1:uA/DUzCuyIZ1NFyAdCz6k+gF8lspujo6ZvoavcSsLCM= -github.com/charmbracelet/teaparty v0.0.0-20200504225426-da64445a0e0d/go.mod h1:PsGcwPVbwjZv3XGW7qGoJ+EkhKqk2owMVUuX3IBUsTw= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -94,8 +95,8 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/muesli/reflow v0.1.0 h1:oQdpLfO56lr5pgLvqD0TcjW85rDjSYSBVdiG1Ch1ddM= github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= -github.com/muesli/termenv v0.5.0/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/muesli/termenv v0.5.2/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= +github.com/muesli/termenv v0.5.3-0.20200526053627-d728968dcf83/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/muesli/termenv v0.6.0 h1:zxvzTBmo4ZcxhNGGWeMz+Tttm51eF5bmPjfy4MCRYlk= github.com/muesli/termenv v0.6.0/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -106,7 +107,6 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/term v0.0.0-20190109203006-aa71e9d9e942/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= github.com/pkg/term v0.0.0-20200520122047-c3ffed290a03 h1:pd4YKIqCB0U7O2I4gWHgEUA2mCEOENmco0l/bM957bU= github.com/pkg/term v0.0.0-20200520122047-c3ffed290a03/go.mod h1:Z9+Ul5bCbBKnbCvdOWbLqTHhJiYV414CURZJba6L8qA= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -176,11 +176,10 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200430202703-d923437fa56d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 h1:DYfZAGf2WMFjMxbgTjaC+2HC7NkNAQs+6Q8b9WEB/F4= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121 h1:rITEj+UZHYC927n8GT97eC3zrpzXdb/voyeOuVKS46o= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/ui/pager.go b/ui/pager.go index 3e66ef2..ea682b1 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -7,9 +7,9 @@ import ( "os" "strings" - "github.com/charmbracelet/boba" - "github.com/charmbracelet/boba/textinput" - "github.com/charmbracelet/boba/viewport" + "github.com/charmbracelet/bubbles/textinput" + "github.com/charmbracelet/bubbles/viewport" + tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/ui/common" "github.com/charmbracelet/glamour" @@ -105,15 +105,15 @@ func (m *pagerModel) unload() { // UPDATE -func pagerUpdate(msg boba.Msg, m pagerModel) (pagerModel, boba.Cmd) { +func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { var ( - cmd boba.Cmd - cmds []boba.Cmd + cmd tea.Cmd + cmds []tea.Cmd ) switch msg := msg.(type) { - case boba.KeyMsg: + case tea.KeyMsg: switch m.state { case pagerStateSetNote: switch msg.String() { @@ -123,7 +123,7 @@ func pagerUpdate(msg boba.Msg, m pagerModel) (pagerModel, boba.Cmd) { m.state = pagerStateBrowse return m, nil case "enter": - var cmd boba.Cmd + var cmd tea.Cmd if m.textInput.Value() != m.currentDocument.Note { // don't update if the note didn't change m.currentDocument.Note = m.textInput.Value() // update optimistically cmd = saveDocumentNote(m.cc, m.currentDocument.ID, m.currentDocument.Note) @@ -170,7 +170,7 @@ func pagerUpdate(msg boba.Msg, m pagerModel) (pagerModel, boba.Cmd) { return m, nil } - var cmd boba.Cmd + var cmd tea.Cmd if m.currentDocument != nil { cmd = renderWithGlamour(m, m.currentDocument.Body) } @@ -186,7 +186,7 @@ func pagerUpdate(msg boba.Msg, m pagerModel) (pagerModel, boba.Cmd) { cmds = append(cmds, cmd) } - return m, boba.Batch(cmds...) + return m, tea.Batch(cmds...) } // VIEW @@ -243,8 +243,8 @@ func pagerSetNoteView(m pagerModel) string { // CMD -func renderWithGlamour(m pagerModel, md string) boba.Cmd { - return func() boba.Msg { +func renderWithGlamour(m pagerModel, md string) tea.Cmd { + return func() tea.Msg { s, err := glamourRender(m, md) if err != nil { return errMsg(err) @@ -253,13 +253,13 @@ func renderWithGlamour(m pagerModel, md string) boba.Cmd { } } -func saveDocumentNote(cc *charm.Client, id int, note string) boba.Cmd { +func saveDocumentNote(cc *charm.Client, id int, note string) tea.Cmd { if cc == nil { - return func() boba.Msg { + return func() tea.Msg { return errMsg(errors.New("can't set note; no charm client")) } } - return func() boba.Msg { + return func() tea.Msg { if err := cc.SetMarkdownNote(id, note); err != nil { return errMsg(err) } diff --git a/ui/stash.go b/ui/stash.go index e5f97c5..12ea063 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -7,10 +7,10 @@ import ( "strings" "time" - "github.com/charmbracelet/boba" - "github.com/charmbracelet/boba/paginator" - "github.com/charmbracelet/boba/spinner" - "github.com/charmbracelet/boba/textinput" + "github.com/charmbracelet/bubbles/paginator" + "github.com/charmbracelet/bubbles/spinner" + "github.com/charmbracelet/bubbles/textinput" + tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/ui/common" "github.com/dustin/go-humanize" @@ -145,11 +145,11 @@ func (m *stashModel) addMarkdowns(mds ...*markdown) { // INIT -func stashInit(cc *charm.Client) (stashModel, boba.Cmd) { +func stashInit(cc *charm.Client) (stashModel, tea.Cmd) { s := spinner.NewModel() s.Type = spinner.Dot s.ForegroundColor = common.SpinnerColor - s.CustomMsgFunc = func() boba.Msg { return stashSpinnerTickMsg{} } + s.CustomMsgFunc = func() tea.Msg { return stashSpinnerTickMsg{} } p := paginator.NewModel() p.Type = paginator.Dots @@ -169,7 +169,7 @@ func stashInit(cc *charm.Client) (stashModel, boba.Cmd) { paginator: p, } - return m, boba.Batch( + return m, tea.Batch( loadStash(m), loadNews(m), spinner.Tick(s), @@ -178,10 +178,10 @@ func stashInit(cc *charm.Client) (stashModel, boba.Cmd) { // UPDATE -func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { +func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { var ( - cmd boba.Cmd - cmds []boba.Cmd + cmd tea.Cmd + cmds []tea.Cmd ) switch msg := msg.(type) { @@ -233,7 +233,7 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { switch m.state { case stashStateReady: - if msg, ok := msg.(boba.KeyMsg); ok { + if msg, ok := msg.(tea.KeyMsg); ok { switch msg.String() { case "k": @@ -320,7 +320,7 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { } case stashStatePromptDelete: - if msg, ok := msg.(boba.KeyMsg); ok { + if msg, ok := msg.(tea.KeyMsg); ok { switch msg.String() { // Confirm deletion @@ -351,7 +351,7 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { case stashStateSettingNote: - if msg, ok := msg.(boba.KeyMsg); ok { + if msg, ok := msg.(tea.KeyMsg); ok { switch msg.String() { case "q": fallthrough @@ -380,7 +380,7 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { // If an item is being confirmed for delete, any key (other than the key // used for confirmation above) cancels the deletion - return m, boba.Batch(cmds...) + return m, tea.Batch(cmds...) } // VIEW @@ -508,8 +508,8 @@ func stashHelpView(m stashModel) string { // CMD -func loadStash(m stashModel) boba.Cmd { - return func() boba.Msg { +func loadStash(m stashModel) tea.Cmd { + return func() tea.Msg { stash, err := m.cc.GetStash(m.page) if err != nil { return errMsg(err) @@ -518,8 +518,8 @@ func loadStash(m stashModel) boba.Cmd { } } -func loadNews(m stashModel) boba.Cmd { - return func() boba.Msg { +func loadNews(m stashModel) tea.Cmd { + return func() tea.Msg { news, err := m.cc.GetNews(1) // just fetch the first page if err != nil { return errMsg(err) @@ -528,8 +528,8 @@ func loadNews(m stashModel) boba.Cmd { } } -func loadMarkdown(cc *charm.Client, id int, t markdownType) boba.Cmd { - return func() boba.Msg { +func loadMarkdown(cc *charm.Client, id int, t markdownType) tea.Cmd { + return func() tea.Msg { var ( md *charm.Markdown err error @@ -549,8 +549,8 @@ func loadMarkdown(cc *charm.Client, id int, t markdownType) boba.Cmd { } } -func deleteStashedItem(cc *charm.Client, id int) boba.Cmd { - return func() boba.Msg { +func deleteStashedItem(cc *charm.Client, id int) tea.Cmd { + return func() tea.Msg { err := cc.DeleteMarkdown(id) if err != nil { return errMsg(err) diff --git a/ui/stashitem.go b/ui/stashitem.go index 228507b..dd651a0 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -4,7 +4,7 @@ import ( "fmt" "strings" - "github.com/charmbracelet/boba/textinput" + "github.com/charmbracelet/bubbles/textinput" "github.com/charmbracelet/charm/ui/common" te "github.com/muesli/termenv" ) diff --git a/ui/ui.go b/ui/ui.go index 273e778..6ec997b 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -4,8 +4,8 @@ import ( "errors" "fmt" - "github.com/charmbracelet/boba" - "github.com/charmbracelet/boba/spinner" + "github.com/charmbracelet/bubbles/spinner" + tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/ui/common" "github.com/charmbracelet/charm/ui/keygen" @@ -21,9 +21,9 @@ var ( glowLogoTextColor = common.Color("#ECFD65") ) -// NewProgram returns a new Boba program -func NewProgram(style string) *boba.Program { - return boba.NewProgram(initialize(style), update, view) +// NewProgram returns a new Tea program +func NewProgram(style string) *tea.Program { + return tea.NewProgram(initialize(style), update, view) } // MESSAGES @@ -87,8 +87,8 @@ func (m *model) unloadDocument() { // INIT -func initialize(style string) func() (boba.Model, boba.Cmd) { - return func() (boba.Model, boba.Cmd) { +func initialize(style string) func() (tea.Model, tea.Cmd) { + return func() (tea.Model, tea.Cmd) { s := spinner.NewModel() s.Type = spinner.Dot s.ForegroundColor = common.SpinnerColor @@ -106,7 +106,7 @@ func initialize(style string) func() (boba.Model, boba.Cmd) { spinner: s, pager: newPagerModel(style), state: stateInitCharmClient, - }, boba.Batch( + }, tea.Batch( newCharmClient, spinner.Tick(s), getTerminalSize(), @@ -117,27 +117,27 @@ func initialize(style string) func() (boba.Model, boba.Cmd) { // UPDATE -func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { +func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { m, ok := mdl.(model) if !ok { return model{ err: errors.New("could not perform assertion on model in update"), - }, boba.Quit + }, tea.Quit } var ( - cmd boba.Cmd - cmds []boba.Cmd + cmd tea.Cmd + cmds []tea.Cmd ) switch msg := msg.(type) { - case boba.KeyMsg: + case tea.KeyMsg: switch msg.String() { case "q": fallthrough case "esc": - var cmd boba.Cmd + var cmd tea.Cmd switch m.state { case stateShowStash: @@ -159,10 +159,10 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { return m, cmd } - return m, boba.Quit + return m, tea.Quit case "ctrl+c": - return m, boba.Quit + return m, tea.Quit // Repaint case "ctrl+l": @@ -201,7 +201,7 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { } else { // The keygen didn't work and we can't auth m.err = errors.New("SSH authentication failed") - return m, boba.Quit + return m, tea.Quit } case spinner.TickMsg: @@ -243,11 +243,11 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { case stateKeygenRunning: // Process keygen - mdl, cmd := keygen.Update(msg, boba.Model(m.keygen)) + mdl, cmd := keygen.Update(msg, tea.Model(m.keygen)) keygenModel, ok := mdl.(keygen.Model) if !ok { m.err = errors.New("could not perform assertion on keygen model in main update") - return m, boba.Quit + return m, tea.Quit } m.keygen = keygenModel cmds = append(cmds, cmd) @@ -263,12 +263,12 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { cmds = append(cmds, cmd) } - return m, boba.Batch(cmds...) + return m, tea.Batch(cmds...) } // VIEW -func view(mdl boba.Model) string { +func view(mdl tea.Model) string { m, ok := mdl.(model) if !ok { return "could not perform assertion on model in view" @@ -297,19 +297,19 @@ func view(mdl boba.Model) string { // COMMANDS -func listenForTerminalResize() boba.Cmd { - return boba.OnResize(func() boba.Msg { +func listenForTerminalResize() tea.Cmd { + return tea.OnResize(func() tea.Msg { return terminalResizedMsg{} }) } -func getTerminalSize() boba.Cmd { - return boba.GetTerminalSize(func(w, h int, err error) boba.TerminalSizeMsg { +func getTerminalSize() tea.Cmd { + return tea.GetTerminalSize(func(w, h int, err error) tea.TerminalSizeMsg { return terminalSizeMsg{width: w, height: h, err: err} }) } -func newCharmClient() boba.Msg { +func newCharmClient() tea.Msg { cfg, err := charm.ConfigFromEnv() if err != nil { return errMsg(err)