1package commands
2
3import (
4	"errors"
5
6	"github.com/emersion/go-imap"
7	"github.com/emersion/go-imap/utf7"
8)
9
10// List is a LIST command, as defined in RFC 3501 section 6.3.8. If Subscribed
11// is set to true, LSUB will be used instead.
12type List struct {
13	Reference string
14	Mailbox   string
15
16	Subscribed bool
17}
18
19func (cmd *List) Command() *imap.Command {
20	name := "LIST"
21	if cmd.Subscribed {
22		name = "LSUB"
23	}
24
25	enc := utf7.Encoding.NewEncoder()
26	ref, _ := enc.String(cmd.Reference)
27	mailbox, _ := enc.String(cmd.Mailbox)
28
29	return &imap.Command{
30		Name:      name,
31		Arguments: []interface{}{ref, mailbox},
32	}
33}
34
35func (cmd *List) Parse(fields []interface{}) error {
36	if len(fields) < 2 {
37		return errors.New("No enough arguments")
38	}
39
40	dec := utf7.Encoding.NewDecoder()
41
42	if mailbox, err := imap.ParseString(fields[0]); err != nil {
43		return err
44	} else if mailbox, err := dec.String(mailbox); err != nil {
45		return err
46	} else {
47		// TODO: canonical mailbox path
48		cmd.Reference = imap.CanonicalMailboxName(mailbox)
49	}
50
51	if mailbox, err := imap.ParseString(fields[1]); err != nil {
52		return err
53	} else if mailbox, err := dec.String(mailbox); err != nil {
54		return err
55	} else {
56		cmd.Mailbox = imap.CanonicalMailboxName(mailbox)
57	}
58
59	return nil
60}
61