aboutsummaryrefslogtreecommitdiff
path: root/vendor/github.com/emersion/go-imap/responses/list.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/emersion/go-imap/responses/list.go')
-rw-r--r--vendor/github.com/emersion/go-imap/responses/list.go57
1 files changed, 57 insertions, 0 deletions
diff --git a/vendor/github.com/emersion/go-imap/responses/list.go b/vendor/github.com/emersion/go-imap/responses/list.go
new file mode 100644
index 0000000..e080fc1
--- /dev/null
+++ b/vendor/github.com/emersion/go-imap/responses/list.go
@@ -0,0 +1,57 @@
+package responses
+
+import (
+ "github.com/emersion/go-imap"
+)
+
+const (
+ listName = "LIST"
+ lsubName = "LSUB"
+)
+
+// A LIST response.
+// If Subscribed is set to true, LSUB will be used instead.
+// See RFC 3501 section 7.2.2
+type List struct {
+ Mailboxes chan *imap.MailboxInfo
+ Subscribed bool
+}
+
+func (r *List) Name() string {
+ if r.Subscribed {
+ return lsubName
+ } else {
+ return listName
+ }
+}
+
+func (r *List) Handle(resp imap.Resp) error {
+ name, fields, ok := imap.ParseNamedResp(resp)
+ if !ok || name != r.Name() {
+ return ErrUnhandled
+ }
+
+ mbox := &imap.MailboxInfo{}
+ if err := mbox.Parse(fields); err != nil {
+ return err
+ }
+
+ r.Mailboxes <- mbox
+ return nil
+}
+
+func (r *List) WriteTo(w *imap.Writer) error {
+ respName := r.Name()
+
+ for mbox := range r.Mailboxes {
+ fields := []interface{}{imap.RawString(respName)}
+ fields = append(fields, mbox.Format()...)
+
+ resp := imap.NewUntaggedResp(fields)
+ if err := resp.WriteTo(w); err != nil {
+ return err
+ }
+ }
+
+ return nil
+}