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