Initial pass on worker/UI message passing

This commit is contained in:
Drew DeVault 2018-01-09 20:39:00 -05:00
parent 7d0edcc9e7
commit 6394e386c2
5 changed files with 145 additions and 5 deletions

View File

@ -4,6 +4,8 @@ import (
"fmt" "fmt"
"git.sr.ht/~sircmpwn/aerc2/config" "git.sr.ht/~sircmpwn/aerc2/config"
"git.sr.ht/~sircmpwn/aerc2/worker"
"git.sr.ht/~sircmpwn/aerc2/worker/types"
) )
func main() { func main() {
@ -15,4 +17,12 @@ func main() {
panic(err) panic(err)
} }
fmt.Printf("%+v\n", *c) fmt.Printf("%+v\n", *c)
w := worker.NewWorker("")
go w.Run()
w.PostAction(types.Ping{})
for {
if msg := w.GetMessage(); msg != nil {
fmt.Printf("<- %T: %v\n", msg, msg)
}
}
} }

View File

@ -20,7 +20,6 @@ type UIConfig struct {
} }
type AccountConfig struct { type AccountConfig struct {
ConfigPath string
Name string Name string
Source string Source string
Folders []string Folders []string

58
worker/imap/worker.go Normal file
View File

@ -0,0 +1,58 @@
package imap
import (
"git.sr.ht/~sircmpwn/aerc2/worker/types"
"fmt"
)
type IMAPWorker struct {
messages chan types.WorkerMessage
actions chan types.WorkerMessage
}
func NewIMAPWorker() *IMAPWorker {
return &IMAPWorker{
messages: make(chan types.WorkerMessage, 50),
actions: make(chan types.WorkerMessage, 50),
}
}
func (w *IMAPWorker) GetMessage() types.WorkerMessage {
select {
case msg := <-w.messages:
return msg
default:
return nil
}
}
func (w *IMAPWorker) PostAction(msg types.WorkerMessage) {
w.actions <- msg
}
func (w *IMAPWorker) handleMessage(_msg types.WorkerMessage) {
switch msg := _msg.(type) {
case types.Ping:
w.messages <- &types.Ack{
Message: types.RespondTo(msg),
}
default:
w.messages <- &types.Unsupported{
Message: types.RespondTo(_msg),
}
}
}
func (w *IMAPWorker) Run() {
// TODO: IMAP shit
for {
select {
case msg := <-w.actions:
fmt.Printf("<= %T: %+v\n", msg, msg)
w.handleMessage(msg)
default:
// no-op
}
}
}

55
worker/types/messages.go Normal file
View File

@ -0,0 +1,55 @@
package types
import (
"git.sr.ht/~sircmpwn/aerc2/config"
)
type WorkerMessage interface {
InResponseTo() WorkerMessage
}
type Message struct {
inResponseTo WorkerMessage
}
// Meta-messages
type Ack struct {
Message
}
type Error struct {
Message
Error error
}
type Unsupported struct {
Message
}
// Commands
type Ping struct {
Message
}
type Configure struct {
Message
Config config.AccountConfig
}
type Connect struct {
Message
}
type Disconnect struct {
Message
}
func RespondTo(msg WorkerMessage) Message {
return Message{
inResponseTo: msg,
}
}
func (m Message) InResponseTo() WorkerMessage {
return m.inResponseTo
}

18
worker/worker.go Normal file
View File

@ -0,0 +1,18 @@
package worker
import (
"git.sr.ht/~sircmpwn/aerc2/worker/imap"
"git.sr.ht/~sircmpwn/aerc2/worker/types"
)
type Worker interface {
GetMessage() types.WorkerMessage
PostAction(types.WorkerMessage)
Run()
}
// Guesses the appropriate worker type based on the given source string
func NewWorker(source string) Worker {
// TODO: Do this properly
return imap.NewIMAPWorker()
}