aboutsummaryrefslogtreecommitdiff
path: root/internal/imap/commando.go
diff options
context:
space:
mode:
authorRené 'Necoro' Neumann <necoro@necoro.eu>2020-04-22 23:40:53 +0200
committerRené 'Necoro' Neumann <necoro@necoro.eu>2020-04-22 23:40:53 +0200
commit9280ecb7e0b0039d6c1f4800373eb76452145078 (patch)
treee3dd11e9953f949709505731a16e8246afe536aa /internal/imap/commando.go
parent15b6c155a8476cf86e8bd745e239e55e77317909 (diff)
downloadfeed2imap-go-9280ecb7e0b0039d6c1f4800373eb76452145078.tar.gz
feed2imap-go-9280ecb7e0b0039d6c1f4800373eb76452145078.tar.bz2
feed2imap-go-9280ecb7e0b0039d6c1f4800373eb76452145078.zip
Concurrent feed processing; central imap handler
Diffstat (limited to 'internal/imap/commando.go')
-rw-r--r--internal/imap/commando.go92
1 files changed, 92 insertions, 0 deletions
diff --git a/internal/imap/commando.go b/internal/imap/commando.go
new file mode 100644
index 0000000..fbfeaec
--- /dev/null
+++ b/internal/imap/commando.go
@@ -0,0 +1,92 @@
+package imap
+
+import "github.com/Necoro/feed2imap-go/internal/log"
+
+const maxPipeDepth = 10
+
+type commander struct {
+ client *Client
+ pipe chan<- execution
+ done chan<- struct{}
+}
+
+type command interface {
+ execute(client *Client) error
+}
+
+type ErrorHandler func(error) string
+
+type execution struct {
+ cmd command
+ done chan<- struct{}
+ errorHandler ErrorHandler
+}
+
+type addCommando struct {
+ folder Folder
+ messages []string
+}
+
+func (cmd addCommando) execute(client *Client) error {
+ return client.putMessages(cmd.folder, cmd.messages)
+}
+
+type ensureCommando struct {
+ folder Folder
+}
+
+func (cmd ensureCommando) execute(client *Client) error {
+ return client.ensureFolder(cmd.folder)
+}
+
+func (commander *commander) execute(command command, handler ErrorHandler) {
+ done := make(chan struct{})
+ commander.pipe <- execution{command, done, handler}
+ <-done
+}
+
+func executioner(client *Client, pipe <-chan execution, done <-chan struct{}) {
+ for {
+ select {
+ case <-done:
+ return
+ case execution := <-pipe:
+ select { // break as soon as done is there
+ case <-done:
+ return
+ default:
+ }
+ if err := execution.cmd.execute(client); err != nil {
+ if execution.errorHandler == nil {
+ log.Error(err)
+ } else {
+ log.Error(execution.errorHandler(err))
+ }
+ }
+ close(execution.done)
+ }
+ }
+}
+
+func (client *Client) startCommander() {
+ if client.commander != nil {
+ return
+ }
+
+ pipe := make(chan execution, maxPipeDepth)
+ done := make(chan struct{})
+
+ client.commander = &commander{client, pipe, done}
+
+ go executioner(client, pipe, done)
+}
+
+func (client *Client) stopCommander() {
+ if client.commander == nil {
+ return
+ }
+
+ close(client.commander.done)
+
+ client.commander = nil
+}
='deletions'>-1/+1 2008-01-18 r651@Devoty: necoro | 2008-01-18 02:41:51 +0100Necoro3-393/+513 2008-01-18 r643@Devoty: necoro | 2008-01-16 18:55:49 +0100Necoro14-249/+525 2008-01-14 r634@Devoty: necoro | 2008-01-14 23:48:24 +0100Necoro3-1/+4 2008-01-14 r632@Devoty: necoro | 2008-01-14 23:44:52 +0100Necoro3-175/+181 2008-01-14(no commit message)Necoro10-758/+1014 2008-01-14 r621@Devoty: necoro | 2008-01-14 20:21:40 +0100Necoro2-21/+61 2008-01-14 r618@Devoty: necoro | 2008-01-14 20:19:05 +0100Necoro2-35/+57 2008-01-14 r617@Devoty: necoro | 2008-01-14 19:12:59 +0100Necoro2-10/+10 2008-01-14 r609@Devoty: necoro | 2008-01-14 17:04:38 +0100Necoro9-394/+477 2008-01-14 r605@Devoty: necoro | 2008-01-14 11:43:34 +0100Necoro2-26/+129 2008-01-14 r603@Devoty: necoro | 2008-01-14 11:30:26 +0100Necoro4-26/+38 2008-01-11 r598@Devoty: necoro | 2008-01-10 16:36:29 +0100Necoro4-10/+50 2008-01-11 r597@Devoty: necoro | 2008-01-10 14:12:35 +0100Necoro1-3/+3 2008-01-10 r595@Devoty: necoro | 2008-01-10 04:04:15 +0100Necoro1-52/+3 2008-01-09 r586@Devoty: necoro | 2008-01-09 14:54:18 +0100Necoro1-1/+1 2007-12-06 r577@Devoty: necoro | 2007-12-06 20:37:36 +0100Necoro1-1/+1 2007-12-06 r572@Devoty: necoro | 2007-11-28 08:48:15 +0100Necoro1-0/+1 2007-11-27 r570@Devoty: necoro | 2007-11-27 02:08:21 +0100Necoro3-84/+108