aboutsummaryrefslogtreecommitdiffstats
path: root/commands/completion_helpers.go
diff options
context:
space:
mode:
Diffstat (limited to 'commands/completion_helpers.go')
-rw-r--r--commands/completion_helpers.go78
1 files changed, 78 insertions, 0 deletions
diff --git a/commands/completion_helpers.go b/commands/completion_helpers.go
new file mode 100644
index 00000000..96a423ee
--- /dev/null
+++ b/commands/completion_helpers.go
@@ -0,0 +1,78 @@
+package commands
+
+import (
+ "fmt"
+ "net/mail"
+ "strings"
+
+ "git.sr.ht/~rjarry/aerc/completer"
+ "git.sr.ht/~rjarry/aerc/config"
+ "git.sr.ht/~rjarry/aerc/log"
+ "git.sr.ht/~rjarry/aerc/widgets"
+)
+
+// GetAddress uses the address-book-cmd for address completion
+func GetAddress(aerc *widgets.Aerc, search string) []string {
+ var options []string
+
+ cmd := aerc.SelectedAccount().AccountConfig().AddressBookCmd
+ if cmd == "" {
+ cmd = config.Compose.AddressBookCmd
+ if cmd == "" {
+ return nil
+ }
+ }
+
+ cmpl := completer.New(cmd, func(err error) {
+ aerc.PushError(
+ fmt.Sprintf("could not complete header: %v", err))
+ log.Warnf("could not complete header: %v", err)
+ })
+
+ if len(search) > config.Ui.CompletionMinChars && cmpl != nil {
+ addrList, _ := cmpl.ForHeader("to")(search)
+ for _, full := range addrList {
+ addr, err := mail.ParseAddress(full)
+ if err != nil {
+ continue
+ }
+ options = append(options, addr.Address)
+ }
+ }
+
+ return options
+}
+
+// GetFlagList returns a list of available flags for completion
+func GetFlagList() []string {
+ return []string{"Seen", "Answered", "Flagged"}
+}
+
+// GetDateList returns a list of date terms for completion
+func GetDateList() []string {
+ return []string{
+ "today", "yesterday", "this_week", "this_month",
+ "this_year", "last_week", "last_month", "last_year",
+ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday",
+ "Saturday", "Sunday",
+ }
+}
+
+// Operands returns a slice without any option flags or mandatory option
+// arguments
+func Operands(args []string, spec string) []string {
+ var result []string
+ for i := 0; i < len(args); i++ {
+ if s := args[i]; s == "--" {
+ return args[i+1:]
+ } else if strings.HasPrefix(s, "-") && len(spec) > 0 {
+ r := string(s[len(s)-1]) + ":"
+ if strings.Contains(spec, r) {
+ i++
+ }
+ continue
+ }
+ result = append(result, args[i])
+ }
+ return result
+}