about summary refs log tree commit diff stats
path: root/commands/msg
diff options
context:
space:
mode:
Diffstat (limited to 'commands/msg')
-rw-r--r--commands/msg/mark.go98
1 files changed, 98 insertions, 0 deletions
diff --git a/commands/msg/mark.go b/commands/msg/mark.go
new file mode 100644
index 0000000..6738a5e
--- /dev/null
+++ b/commands/msg/mark.go
@@ -0,0 +1,98 @@
+package msg
+
+import (
+	"fmt"
+
+	"git.sr.ht/~sircmpwn/aerc/widgets"
+	"git.sr.ht/~sircmpwn/getopt"
+)
+
+type Mark struct{}
+
+func init() {
+	register(Mark{})
+}
+
+func (Mark) Aliases() []string {
+	return []string{"mark", "unmark"}
+}
+
+func (Mark) Complete(aerc *widgets.Aerc, args []string) []string {
+	return nil
+}
+
+func (Mark) Execute(aerc *widgets.Aerc, args []string) error {
+	h := newHelper(aerc)
+	selected, err := h.msgProvider.SelectedMessage()
+	if err != nil {
+		return err
+	}
+	store, err := h.store()
+	if err != nil {
+		return err
+	}
+	opts, _, err := getopt.Getopts(args, "atv")
+	if err != nil {
+		return err
+	}
+	var all bool
+	var toggle bool
+	var visual bool
+	for _, opt := range opts {
+		switch opt.Option {
+		case 'a':
+			all = true
+		case 'v':
+			visual = true
+		case 't':
+			toggle = true
+		}
+	}
+
+	switch args[0] {
+	case "mark":
+		if all && visual {
+			return fmt.Errorf("-a and -v are mutually exclusive")
+		}
+
+		var modFunc func(uint32)
+		if toggle {
+			modFunc = store.ToggleMark
+		} else {
+			modFunc = store.Mark
+		}
+		if all {
+			uids := store.Uids()
+			for _, uid := range uids {
+				modFunc(uid)
+			}
+			return nil
+		} else if visual {
+			store.ToggleVisualMark()
+			return nil
+		} else {
+			modFunc(selected.Uid)
+			return nil
+		}
+
+	case "unmark":
+		if visual {
+			return fmt.Errorf("visual mode not suported for this command")
+		}
+
+		if all && toggle {
+			uids := store.Uids()
+			for _, uid := range uids {
+				store.ToggleMark(uid)
+			}
+			return nil
+		} else if all && !toggle {
+			store.ClearVisualMark()
+			return nil
+		} else {
+			store.Unmark(selected.Uid)
+			return nil
+		}
+	}
+	return nil // never reached
+}