1package responses 2 3import ( 4 "github.com/emersion/go-imap" 5) 6 7const ( 8 listName = "LIST" 9 lsubName = "LSUB" 10) 11 12// A LIST response. 13// If Subscribed is set to true, LSUB will be used instead. 14// See RFC 3501 section 7.2.2 15type List struct { 16 Mailboxes chan *imap.MailboxInfo 17 Subscribed bool 18} 19 20func (r *List) Name() string { 21 if r.Subscribed { 22 return lsubName 23 } else { 24 return listName 25 } 26} 27 28func (r *List) Handle(resp imap.Resp) error { 29 name, fields, ok := imap.ParseNamedResp(resp) 30 if !ok || name != r.Name() { 31 return ErrUnhandled 32 } 33 34 mbox := &imap.MailboxInfo{} 35 if err := mbox.Parse(fields); err != nil { 36 return err 37 } 38 39 r.Mailboxes <- mbox 40 return nil 41} 42 43func (r *List) WriteTo(w *imap.Writer) error { 44 respName := r.Name() 45 46 for mbox := range r.Mailboxes { 47 fields := []interface{}{imap.RawString(respName)} 48 fields = append(fields, mbox.Format()...) 49 50 resp := imap.NewUntaggedResp(fields) 51 if err := resp.WriteTo(w); err != nil { 52 return err 53 } 54 } 55 56 return nil 57} 58