From 8d216ab10e6d43c44ca47ccd44fe7f3d40f1b1c3 Mon Sep 17 00:00:00 2001
From: Reto Brunner <reto@labrat.space>
Date: Sat, 15 Feb 2020 14:14:46 +0100
Subject: notmuch: add internal event loop

---
 worker/notmuch/eventhandlers.go |  9 +++++++++
 worker/notmuch/events.go        |  5 +++++
 worker/notmuch/worker.go        | 36 ++++++++++++++++++++++++------------
 3 files changed, 38 insertions(+), 12 deletions(-)
 create mode 100644 worker/notmuch/eventhandlers.go
 create mode 100644 worker/notmuch/events.go

diff --git a/worker/notmuch/eventhandlers.go b/worker/notmuch/eventhandlers.go
new file mode 100644
index 0000000..39027b6
--- /dev/null
+++ b/worker/notmuch/eventhandlers.go
@@ -0,0 +1,9 @@
+package notmuch
+
+func (w *worker) handleNotmuchEvent(et eventType) error {
+	switch ev := et.(type) {
+	default:
+		_ = ev
+		return errUnsupported
+	}
+}
diff --git a/worker/notmuch/events.go b/worker/notmuch/events.go
new file mode 100644
index 0000000..df35b21
--- /dev/null
+++ b/worker/notmuch/events.go
@@ -0,0 +1,5 @@
+package notmuch
+
+type eventType interface{}
+
+type event struct{}
diff --git a/worker/notmuch/worker.go b/worker/notmuch/worker.go
index 43d60e2..7480124 100644
--- a/worker/notmuch/worker.go
+++ b/worker/notmuch/worker.go
@@ -28,6 +28,7 @@ var errUnsupported = fmt.Errorf("unsupported command")
 
 type worker struct {
 	w                   *types.Worker
+	nmEvents            chan eventType
 	query               string
 	uidStore            *uidstore.Store
 	nameQueryMap        map[string]string
@@ -38,23 +39,34 @@ type worker struct {
 
 // NewWorker creates a new maildir worker with the provided worker.
 func NewWorker(w *types.Worker) (types.Backend, error) {
-	return &worker{w: w}, nil
+	events := make(chan eventType, 20)
+	return &worker{w: w,
+		nmEvents: events}, nil
 }
 
 // Run starts the worker's message handling loop.
 func (w *worker) Run() {
 	for {
-		action := <-w.w.Actions
-		msg := w.w.ProcessAction(action)
-		if err := w.handleMessage(msg); err == errUnsupported {
-			w.w.PostMessage(&types.Unsupported{
-				Message: types.RespondTo(msg),
-			}, nil)
-		} else if err != nil {
-			w.w.PostMessage(&types.Error{
-				Message: types.RespondTo(msg),
-				Error:   err,
-			}, nil)
+		select {
+		case action := <-w.w.Actions:
+			msg := w.w.ProcessAction(action)
+			if err := w.handleMessage(msg); err == errUnsupported {
+				w.w.PostMessage(&types.Unsupported{
+					Message: types.RespondTo(msg),
+				}, nil)
+				w.w.Logger.Printf("ProcessAction(%T) unsupported: %v", msg, err)
+			} else if err != nil {
+				w.w.PostMessage(&types.Error{
+					Message: types.RespondTo(msg),
+					Error:   err,
+				}, nil)
+				w.w.Logger.Printf("ProcessAction(%T) failure: %v", msg, err)
+			}
+		case nmEvent := <-w.nmEvents:
+			err := w.handleNotmuchEvent(nmEvent)
+			if err != nil {
+				w.w.Logger.Printf("notmuch event failure: %v", err)
+			}
 		}
 	}
 }
-- 
cgit 1.4.1-2-gfad0