summaryrefslogtreecommitdiff
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
+}