32381592fc335bc26a06cee847df926b9f6e6c06 — Jeffas 13 days ago 282dc44
Add new search behaviour for imap

This patch adds search behaviour to allow searching in the body of the
messages, the entire text (body + header), and searching just the from
header.
2 files changed, 27 insertions(+), 6 deletions(-)

M doc/aerc-search.1.scd
M worker/imap/search.go
M doc/aerc-search.1.scd => doc/aerc-search.1.scd +8 -2
@@ 2,14 2,20 @@   # IMAP
  
- *search* [-ru] <terms...>
+ *search* [-rubt] [-f <from>] <terms...>
  	Searches the current folder for <terms>. Each separate term is searched
- 	case-insensitively among subject lines.
+ 	case-insensitively among subject lines if *-b* or *-t* are not provided.
  
  	*-r*: Search for read messages
  
  	*-u*: Search for unread messages
  
+ 	*-b*: Search in the body of the messages
+ 
+ 	*-t*: Search in the entire text of the messages
+ 
+ 	*-f <from>*: Search for messages from <from>
+ 
  # NOTMUCH
  
  *search* <query...>

M worker/imap/search.go => worker/imap/search.go +19 -4
@@ 1,17 1,20 @@ package imap
  
  import (
- 	"git.sr.ht/~sircmpwn/getopt"
  	"github.com/emersion/go-imap"
+ 
+ 	"git.sr.ht/~sircmpwn/getopt"
  )
  
  func parseSearch(args []string) (*imap.SearchCriteria, error) {
  	criteria := imap.NewSearchCriteria()
  
- 	opts, optind, err := getopt.Getopts(args, "ruH:")
+ 	opts, optind, err := getopt.Getopts(args, "rubtH:f:")
  	if err != nil {
  		return nil, err
  	}
+ 	body := false
+ 	text := false
  	for _, opt := range opts {
  		switch opt.Option {
  		case 'r':


@@ 20,10 23,22 @@ criteria.WithoutFlags = append(criteria.WithoutFlags, imap.SeenFlag)
  		case 'H':
  			// TODO
+ 		case 'f':
+ 			criteria.Header.Add("From", opt.Value)
+ 		case 'b':
+ 			body = true
+ 		case 't':
+ 			text = true
  		}
  	}
- 	for _, arg := range args[optind:] {
- 		criteria.Header.Add("Subject", arg)
+ 	if text {
+ 		criteria.Text = args[optind:]
+ 	} else if body {
+ 		criteria.Body = args[optind:]
+ 	} else {
+ 		for _, arg := range args[optind:] {
+ 			criteria.Header.Add("Subject", arg)
+ 		}
  	}
  	return criteria, nil
  }