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"
|
"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)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,11 +20,10 @@ type UIConfig struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type AccountConfig struct {
|
type AccountConfig struct {
|
||||||
ConfigPath string
|
Name string
|
||||||
Name string
|
Source string
|
||||||
Source string
|
Folders []string
|
||||||
Folders []string
|
Params map[string]string
|
||||||
Params map[string]string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type AercConfig struct {
|
type AercConfig struct {
|
||||||
|
|
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