From 7701f22bf035c8321a8b148befa10ddd2f8b7044 Mon Sep 17 00:00:00 2001
From: Koni Marti <koni.marti@gmail.com>
Date: Tue, 27 Sep 2022 22:22:20 +0200
Subject: [PATCH] mark: fix (un)mark -a when no message is selected

Call SelectedMessage() in the mark command only when the uid of the
currently selected message is actually needed. If no message is
selected, i.e. after some filter operations where the previously
selected message is not in the results, 'mark -a' would fail since no
message is selected and an error is returned from SelectedMessage() even
though this is not necessary to mark or unmark all messages.

Reported-by:  Bence Ferdinandy <bence@ferdinandy.com>
Signed-off-by: Koni Marti <koni.marti@gmail.com>
Acked-by: Tim Culverhouse <tim@timculverhouse.com>
---
 commands/msg/mark.go | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/commands/msg/mark.go b/commands/msg/mark.go
index b5a228d..dcb6d69 100644
--- a/commands/msg/mark.go
+++ b/commands/msg/mark.go
@@ -23,9 +23,16 @@ func (Mark) Complete(aerc *widgets.Aerc, args []string) []string {
 
 func (Mark) Execute(aerc *widgets.Aerc, args []string) error {
 	h := newHelper(aerc)
-	selected, err := h.msgProvider.SelectedMessage()
-	if err != nil {
-		return err
+	OnSelectedMessage := func(fn func(uint32)) error {
+		if fn == nil {
+			return fmt.Errorf("no operation selected")
+		}
+		selected, err := h.msgProvider.SelectedMessage()
+		if err != nil {
+			return err
+		}
+		fn(selected.Uid)
+		return nil
 	}
 	store, err := h.store()
 	if err != nil {
@@ -97,7 +104,7 @@ func (Mark) Execute(aerc *widgets.Aerc, args []string) error {
 					modFunc(uid)
 				}
 			} else {
-				modFunc(selected.Uid)
+				return OnSelectedMessage(modFunc)
 			}
 			return nil
 		}
@@ -123,7 +130,7 @@ func (Mark) Execute(aerc *widgets.Aerc, args []string) error {
 					marker.Unmark(uid)
 				}
 			} else {
-				marker.Unmark(selected.Uid)
+				return OnSelectedMessage(marker.Unmark)
 			}
 			return nil
 		}