diff options
Diffstat (limited to 'worker/imap')
-rw-r--r-- | worker/imap/search.go | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/worker/imap/search.go b/worker/imap/search.go index 42e155b..f866b1c 100644 --- a/worker/imap/search.go +++ b/worker/imap/search.go @@ -1,6 +1,9 @@ package imap import ( + "errors" + "strings" + "github.com/emersion/go-imap" "git.sr.ht/~sircmpwn/getopt" @@ -9,7 +12,7 @@ import ( func parseSearch(args []string) (*imap.SearchCriteria, error) { criteria := imap.NewSearchCriteria() - opts, optind, err := getopt.Getopts(args, "rubat:H:f:c:") + opts, optind, err := getopt.Getopts(args, "rubax:X:t:H:f:c:") if err != nil { return nil, err } @@ -21,6 +24,14 @@ func parseSearch(args []string) (*imap.SearchCriteria, error) { criteria.WithFlags = append(criteria.WithFlags, imap.SeenFlag) case 'u': criteria.WithoutFlags = append(criteria.WithoutFlags, imap.SeenFlag) + case 'x': + if f, err := getParsedFlag(opt.Value); err == nil { + criteria.WithFlags = append(criteria.WithFlags, f) + } + case 'X': + if f, err := getParsedFlag(opt.Value); err == nil { + criteria.WithoutFlags = append(criteria.WithoutFlags, f) + } case 'H': // TODO case 'f': @@ -46,3 +57,15 @@ func parseSearch(args []string) (*imap.SearchCriteria, error) { } return criteria, nil } + +func getParsedFlag(name string) (string, error) { + switch strings.ToLower(name) { + case "seen": + return imap.SeenFlag, nil + case "flagged": + return imap.FlaggedFlag, nil + case "answered": + return imap.AnsweredFlag, nil + } + return imap.FlaggedFlag, errors.New("Flag not suppored") +} |