Initial pass on worker/UI message passing
This commit is contained in:
parent
7d0edcc9e7
commit
6394e386c2
5 changed files with 145 additions and 5 deletions
|
@ -4,6 +4,8 @@ import (
|
|||
"fmt"
|
||||
|
||||
"git.sr.ht/~sircmpwn/aerc2/config"
|
||||
"git.sr.ht/~sircmpwn/aerc2/worker"
|
||||
"git.sr.ht/~sircmpwn/aerc2/worker/types"
|
||||
)
|
||||
|
||||
func main() {
|
||||
|
@ -15,4 +17,12 @@ func main() {
|
|||
panic(err)
|
||||
}
|
||||
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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,7 +20,6 @@ type UIConfig struct {
|
|||
}
|
||||
|
||||
type AccountConfig struct {
|
||||
ConfigPath string
|
||||
Name string
|
||||
Source string
|
||||
Folders []string
|
||||
|
|
58
worker/imap/worker.go
Normal file
58
worker/imap/worker.go
Normal 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
55
worker/types/messages.go
Normal 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
18
worker/worker.go
Normal 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()
|
||||
}
|
Loading…
Reference in a new issue