Change MarkedMessages to return uids
Especially if one tries to interact with all marked messages there could be the case that not all headers are fetched yet, hence the messageInfo is still nil. This segfaults a lot of commands which in principle only need the uid to complete. If we switch to uids, this issue can be alleviated for those commands.
This commit is contained in:
parent
381c1fc05f
commit
ea2646fc03
5 changed files with 30 additions and 14 deletions
|
@ -18,12 +18,7 @@ func newHelper(aerc *widgets.Aerc) *helper {
|
|||
}
|
||||
|
||||
func (h *helper) markedOrSelectedUids() ([]uint32, error) {
|
||||
msgs, err := commands.MarkedOrSelected(h.msgProvider)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
uids := commands.UidsFromMessageInfos(msgs)
|
||||
return uids, nil
|
||||
return commands.MarkedOrSelected(h.msgProvider)
|
||||
}
|
||||
|
||||
func (h *helper) store() (*lib.MessageStore, error) {
|
||||
|
@ -43,5 +38,13 @@ func (h *helper) account() (*widgets.AccountView, error) {
|
|||
}
|
||||
|
||||
func (h *helper) messages() ([]*models.MessageInfo, error) {
|
||||
return commands.MarkedOrSelected(h.msgProvider)
|
||||
uid, err := commands.MarkedOrSelected(h.msgProvider)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
store, err := h.store()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return commands.MsgInfoFromUids(store, uid)
|
||||
}
|
||||
|
|
|
@ -10,6 +10,7 @@ import (
|
|||
"strings"
|
||||
"time"
|
||||
|
||||
"git.sr.ht/~sircmpwn/aerc/lib"
|
||||
"git.sr.ht/~sircmpwn/aerc/models"
|
||||
"git.sr.ht/~sircmpwn/aerc/widgets"
|
||||
"github.com/gdamore/tcell"
|
||||
|
@ -152,7 +153,7 @@ func listDir(path string, hidden bool) []string {
|
|||
|
||||
// MarkedOrSelected returns either all marked messages if any are marked or the
|
||||
// selected message instead
|
||||
func MarkedOrSelected(pm widgets.ProvidesMessages) ([]*models.MessageInfo, error) {
|
||||
func MarkedOrSelected(pm widgets.ProvidesMessages) ([]uint32, error) {
|
||||
// marked has priority over the selected message
|
||||
marked, err := pm.MarkedMessages()
|
||||
if err != nil {
|
||||
|
@ -165,7 +166,7 @@ func MarkedOrSelected(pm widgets.ProvidesMessages) ([]*models.MessageInfo, error
|
|||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return []*models.MessageInfo{msg}, nil
|
||||
return []uint32{msg.Uid}, nil
|
||||
}
|
||||
|
||||
// UidsFromMessageInfos extracts a uid slice from a slice of MessageInfos
|
||||
|
@ -178,3 +179,15 @@ func UidsFromMessageInfos(msgs []*models.MessageInfo) []uint32 {
|
|||
}
|
||||
return uids
|
||||
}
|
||||
|
||||
func MsgInfoFromUids(store *lib.MessageStore, uids []uint32) ([]*models.MessageInfo, error) {
|
||||
infos := make([]*models.MessageInfo, len(uids))
|
||||
for i, uid := range uids {
|
||||
var ok bool
|
||||
infos[i], ok = store.Messages[uid]
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("uid not found")
|
||||
}
|
||||
}
|
||||
return infos, nil
|
||||
}
|
||||
|
|
|
@ -215,9 +215,9 @@ func (acct *AccountView) SelectedMessage() (*models.MessageInfo, error) {
|
|||
return msg, nil
|
||||
}
|
||||
|
||||
func (acct *AccountView) MarkedMessages() ([]*models.MessageInfo, error) {
|
||||
func (acct *AccountView) MarkedMessages() ([]uint32, error) {
|
||||
store := acct.Store()
|
||||
return msgInfoFromUids(store, store.Marked())
|
||||
return store.Marked(), nil
|
||||
}
|
||||
|
||||
func (acct *AccountView) SelectedMessagePart() *PartInfo {
|
||||
|
|
|
@ -262,9 +262,9 @@ func (mv *MessageViewer) SelectedMessage() (*models.MessageInfo, error) {
|
|||
return mv.msg.MessageInfo(), nil
|
||||
}
|
||||
|
||||
func (mv *MessageViewer) MarkedMessages() ([]*models.MessageInfo, error) {
|
||||
func (mv *MessageViewer) MarkedMessages() ([]uint32, error) {
|
||||
store := mv.Store()
|
||||
return msgInfoFromUids(store, store.Marked())
|
||||
return store.Marked(), nil
|
||||
}
|
||||
|
||||
func (mv *MessageViewer) ToggleHeaders() {
|
||||
|
|
|
@ -25,5 +25,5 @@ type ProvidesMessages interface {
|
|||
Store() *lib.MessageStore
|
||||
SelectedAccount() *AccountView
|
||||
SelectedMessage() (*models.MessageInfo, error)
|
||||
MarkedMessages() ([]*models.MessageInfo, error)
|
||||
MarkedMessages() ([]uint32, error)
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue