summary refs log blame commit diff stats
path: root/worker/imap/list.go
blob: 42be50e4ab8805205e7930350d98a1a9d783791c (plain) (tree)
1
2
3
4
5
6
7
8
9




                                     
                                         
                                               

 
                                                                            
                                                 
                                                        
                                      
 
                   
                                             



                                                                                         
                                                                  




                                                                    

                               
                           
           

                                                                     
                      




                                                      
                      


                                                               
 








                                              















                                                                            
package imap

import (
	"github.com/emersion/go-imap"

	"git.sr.ht/~sircmpwn/aerc/models"
	"git.sr.ht/~sircmpwn/aerc/worker/types"
)

func (imapw *IMAPWorker) handleListDirectories(msg *types.ListDirectories) {
	mailboxes := make(chan *imap.MailboxInfo)
	imapw.worker.Logger.Println("Listing mailboxes")
	done := make(chan interface{})

	go func() {
		for mbox := range mailboxes {
			if !canOpen(mbox) {
				// no need to pass this to handlers if it can't be opened
				continue
			}
			imapw.worker.PostMessage(&types.Directory{
				Message: types.RespondTo(msg),
				Dir: &models.Directory{
					Name:       mbox.Name,
					Attributes: mbox.Attributes,
				},
			}, nil)
		}
		done <- nil
	}()

	if err := imapw.client.List("", "*", mailboxes); err != nil {
		<-done
		imapw.worker.PostMessage(&types.Error{
			Message: types.RespondTo(msg),
			Error:   err,
		}, nil)
	} else {
		<-done
		imapw.worker.PostMessage(
			&types.Done{types.RespondTo(msg)}, nil)
	}
}

func canOpen(mbox *imap.MailboxInfo) bool {
	for _, attr := range mbox.Attributes {
		if attr == imap.NoSelectAttr {
			return false
		}
	}
	return true
}

func (imapw *IMAPWorker) handleSearchDirectory(msg *types.SearchDirectory) {
	imapw.worker.Logger.Println("Executing search")

	if uids, err := imapw.client.UidSearch(msg.Criteria); err != nil {
		imapw.worker.PostMessage(&types.Error{
			Message: types.RespondTo(msg),
			Error:   err,
		}, nil)
	} else {
		imapw.worker.PostMessage(&types.SearchResults{
			Message: types.RespondTo(msg),
			Uids:    uids,
		}, nil)
	}
}
gt;<span class="Comment"># Example program showing that a function call can be 'paused' multiple times,</span> <span id="L2" class="LineNr"> 2 </span><span class="Comment"># creating different continuation values.</span> <span id="L3" class="LineNr"> 3 </span><span class="Comment">#</span> <span id="L4" class="LineNr"> 4 </span><span class="Comment"># To run:</span> <span id="L5" class="LineNr"> 5 </span><span class="Comment"># $ git clone <a href="https://github.com/akkartik/mu">https://github.com/akkartik/mu</a></span> <span id="L6" class="LineNr"> 6 </span><span class="Comment"># $ cd mu</span> <span id="L7" class="LineNr"> 7 </span><span class="Comment"># $ ./mu continuation3.mu</span> <span id="L8" class="LineNr"> 8 </span><span class="Comment">#</span> <span id="L9" class="LineNr"> 9 </span><span class="Comment"># Expected output:</span> <span id="L10" class="LineNr">10 </span><span class="Comment"># caller 0</span> <span id="L11" class="LineNr">11 </span><span class="Comment"># callee 0</span> <span id="L12" class="LineNr">12 </span><span class="Comment"># caller 1</span> <span id="L13" class="LineNr">13 </span><span class="Comment"># callee 1</span> <span id="L14" class="LineNr">14 </span><span class="Comment"># caller 2</span> <span id="L15" class="LineNr">15 </span><span class="Comment"># callee 2</span> <span id="L16" class="LineNr">16 </span> <span id="L17" class="LineNr">17 </span><span class="muRecipe">def</span> <a href='continuation3.mu.html#L17'>main</a> [ <span id="L18" class="LineNr">18 </span> <span class="Constant">local-scope</span> <span id="L19" class="LineNr">19 </span> $print <span class="Constant">[caller 0]</span> <span class="Constant">10/newline</span> <span id="L20" class="LineNr">20 </span> k:continuation <span class="Special">&lt;-</span> <span class="muControl">call-with-continuation-mark</span> <span class="Constant">100/mark</span>, <a href='continuation3.mu.html#L27'>f</a> <span id="L21" class="LineNr">21 </span> $print <span class="Constant">[caller 1]</span> <span class="Constant">10/newline</span> <span id="L22" class="LineNr">22 </span> k <span class="Special">&lt;-</span> call k <span id="L23" class="LineNr">23 </span> $print <span class="Constant">[caller 2]</span> <span class="Constant">10/newline</span> <span id="L24" class="LineNr">24 </span> call k <span id="L25" class="LineNr">25 </span>] <span id="L26" class="LineNr">26 </span> <span id="L27" class="LineNr">27 </span><span class="muRecipe">def</span> <a href='continuation3.mu.html#L27'>f</a> [ <span id="L28" class="LineNr">28 </span> <span class="Constant">local-scope</span> <span id="L29" class="LineNr">29 </span> $print <span class="Constant">[callee 0]</span> <span class="Constant">10/newline</span> <span id="L30" class="LineNr">30 </span> <span class="muControl">return-continuation-until-mark</span> <span class="Constant">100/mark</span> <span id="L31" class="LineNr">31 </span> $print <span class="Constant">[callee 1]</span> <span class="Constant">10/newline</span> <span id="L32" class="LineNr">32 </span> <span class="muControl">return-continuation-until-mark</span> <span class="Constant">100/mark</span> <span id="L33" class="LineNr">33 </span> $print <span class="Constant">[callee 2]</span> <span class="Constant">10/newline</span> <span id="L34" class="LineNr">34 </span>] </pre> </body> </html> <!-- vim: set foldmethod=manual : -->