85 lines
1.8 KiB
Go
85 lines
1.8 KiB
Go
package imapclient
|
|
|
|
import (
|
|
"github.com/emersion/go-imap/v2"
|
|
"github.com/emersion/go-imap/v2/internal/imapwire"
|
|
)
|
|
|
|
type SortKey string
|
|
|
|
const (
|
|
SortKeyArrival SortKey = "ARRIVAL"
|
|
SortKeyCc SortKey = "CC"
|
|
SortKeyDate SortKey = "DATE"
|
|
SortKeyFrom SortKey = "FROM"
|
|
SortKeySize SortKey = "SIZE"
|
|
SortKeySubject SortKey = "SUBJECT"
|
|
SortKeyTo SortKey = "TO"
|
|
)
|
|
|
|
type SortCriterion struct {
|
|
Key SortKey
|
|
Reverse bool
|
|
}
|
|
|
|
// SortOptions contains options for the SORT command.
|
|
type SortOptions struct {
|
|
SearchCriteria *imap.SearchCriteria
|
|
SortCriteria []SortCriterion
|
|
}
|
|
|
|
func (c *Client) sort(numKind imapwire.NumKind, options *SortOptions) *SortCommand {
|
|
cmd := &SortCommand{}
|
|
enc := c.beginCommand(uidCmdName("SORT", numKind), cmd)
|
|
enc.SP().List(len(options.SortCriteria), func(i int) {
|
|
criterion := options.SortCriteria[i]
|
|
if criterion.Reverse {
|
|
enc.Atom("REVERSE").SP()
|
|
}
|
|
enc.Atom(string(criterion.Key))
|
|
})
|
|
enc.SP().Atom("UTF-8").SP()
|
|
writeSearchKey(enc.Encoder, options.SearchCriteria)
|
|
enc.end()
|
|
return cmd
|
|
}
|
|
|
|
func (c *Client) handleSort() error {
|
|
cmd := findPendingCmdByType[*SortCommand](c)
|
|
for c.dec.SP() {
|
|
var num uint32
|
|
if !c.dec.ExpectNumber(&num) {
|
|
return c.dec.Err()
|
|
}
|
|
if cmd != nil {
|
|
cmd.nums = append(cmd.nums, num)
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Sort sends a SORT command.
|
|
//
|
|
// This command requires support for the SORT extension.
|
|
func (c *Client) Sort(options *SortOptions) *SortCommand {
|
|
return c.sort(imapwire.NumKindSeq, options)
|
|
}
|
|
|
|
// UIDSort sends a UID SORT command.
|
|
//
|
|
// See Sort.
|
|
func (c *Client) UIDSort(options *SortOptions) *SortCommand {
|
|
return c.sort(imapwire.NumKindUID, options)
|
|
}
|
|
|
|
// SortCommand is a SORT command.
|
|
type SortCommand struct {
|
|
commandBase
|
|
nums []uint32
|
|
}
|
|
|
|
func (cmd *SortCommand) Wait() ([]uint32, error) {
|
|
err := cmd.wait()
|
|
return cmd.nums, err
|
|
}
|