about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--commands/msg/utils.go55
-rw-r--r--commands/util.go30
2 files changed, 85 insertions, 0 deletions
diff --git a/commands/msg/utils.go b/commands/msg/utils.go
new file mode 100644
index 0000000..30a4394
--- /dev/null
+++ b/commands/msg/utils.go
@@ -0,0 +1,55 @@
+package msg
+
+import (
+	"errors"
+
+	"git.sr.ht/~sircmpwn/aerc/commands"
+	"git.sr.ht/~sircmpwn/aerc/lib"
+	"git.sr.ht/~sircmpwn/aerc/models"
+	"git.sr.ht/~sircmpwn/aerc/widgets"
+)
+
+type helper struct {
+	msgProvider widgets.ProvidesMessages
+}
+
+func newHelper(aerc *widgets.Aerc) *helper {
+	return &helper{aerc.SelectedTab().(widgets.ProvidesMessages)}
+}
+
+func (h *helper) uids() ([]uint32, error) {
+	msgs, err := commands.MarkedOrSelected(h.msgProvider)
+	if err != nil {
+		return nil, err
+	}
+	uids := commands.UidsFromMessageInfos(msgs)
+	return uids, nil
+}
+
+func (h *helper) store() (*lib.MessageStore, error) {
+	store := h.msgProvider.Store()
+	if store == nil {
+		return nil, errors.New("Cannot perform action. Messages still loading")
+	}
+	return store, nil
+}
+
+func (h *helper) account() (*widgets.AccountView, error) {
+	acct := h.msgProvider.SelectedAccount()
+	if acct == nil {
+		return nil, errors.New("No account selected")
+	}
+	return acct, nil
+}
+
+func (h *helper) messages() ([]*models.MessageInfo, error) {
+	return commands.MarkedOrSelected(h.msgProvider)
+}
+
+func (h *helper) messageUids() ([]uint32, error) {
+	msgs, err := h.messages()
+	if err != nil {
+		return nil, err
+	}
+	return commands.UidsFromMessageInfos(msgs), nil
+}
diff --git a/commands/util.go b/commands/util.go
index a5c30af..5529edb 100644
--- a/commands/util.go
+++ b/commands/util.go
@@ -10,6 +10,7 @@ import (
 	"strings"
 	"time"
 
+	"git.sr.ht/~sircmpwn/aerc/models"
 	"git.sr.ht/~sircmpwn/aerc/widgets"
 	"github.com/gdamore/tcell"
 	"github.com/mitchellh/go-homedir"
@@ -148,3 +149,32 @@ func listDir(path string, hidden bool) []string {
 
 	return filtered
 }
+
+// MarkedOrSelected returns either all marked messages if any are marked or the
+// selected message instead
+func MarkedOrSelected(pm widgets.ProvidesMessages) ([]*models.MessageInfo, error) {
+	// marked has priority over the selected message
+	marked, err := pm.MarkedMessages()
+	if err != nil {
+		return nil, err
+	}
+	if len(marked) > 0 {
+		return marked, nil
+	}
+	msg, err := pm.SelectedMessage()
+	if err != nil {
+		return nil, err
+	}
+	return []*models.MessageInfo{msg}, nil
+}
+
+// UidsFromMessageInfos extracts a uid slice from a slice of MessageInfos
+func UidsFromMessageInfos(msgs []*models.MessageInfo) []uint32 {
+	uids := make([]uint32, len(msgs))
+	i := 0
+	for _, msg := range msgs {
+		uids[i] = msg.Uid
+		i++
+	}
+	return uids
+}