diff --git a/commands/msg/utils.go b/commands/msg/utils.go index ae25535..cad0f82 100644 --- a/commands/msg/utils.go +++ b/commands/msg/utils.go @@ -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) } diff --git a/commands/util.go b/commands/util.go index 5529edb..e3395fd 100644 --- a/commands/util.go +++ b/commands/util.go @@ -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 +} diff --git a/widgets/account.go b/widgets/account.go index 31384a5..20ed345 100644 --- a/widgets/account.go +++ b/widgets/account.go @@ -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 { diff --git a/widgets/msgviewer.go b/widgets/msgviewer.go index e192ae6..0cfabd7 100644 --- a/widgets/msgviewer.go +++ b/widgets/msgviewer.go @@ -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() { diff --git a/widgets/providesmessage.go b/widgets/providesmessage.go index b06825f..6e00b1c 100644 --- a/widgets/providesmessage.go +++ b/widgets/providesmessage.go @@ -25,5 +25,5 @@ type ProvidesMessages interface { Store() *lib.MessageStore SelectedAccount() *AccountView SelectedMessage() (*models.MessageInfo, error) - MarkedMessages() ([]*models.MessageInfo, error) + MarkedMessages() ([]uint32, error) }