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