summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--cmd/aerc/main.go27
-rw-r--r--config/config.go45
-rw-r--r--worker/imap/worker.go6
-rw-r--r--worker/worker.go20
4 files changed, 83 insertions, 15 deletions
diff --git a/cmd/aerc/main.go b/cmd/aerc/main.go
index 2627a71..d5d0897 100644
--- a/cmd/aerc/main.go
+++ b/cmd/aerc/main.go
@@ -10,19 +10,28 @@ import (
 
 func main() {
 	var (
-		c   *config.AercConfig
-		err error
+		conf *config.AercConfig
+		err  error
 	)
-	if c, err = config.LoadConfig(nil); err != nil {
+	if conf, err = config.LoadConfig(nil); err != nil {
 		panic(err)
 	}
-	fmt.Printf("%+v\n", *c)
-	w := worker.NewWorker("")
-	go w.Run()
-	w.PostAction(types.Ping{})
+	workers := make([]worker.Worker, 0)
+	for _, account := range conf.Accounts {
+		var work worker.Worker
+		if work, err = worker.NewWorker(account.Source); err != nil {
+			panic(err)
+		}
+		fmt.Printf("Initializing worker %s\n", account.Name)
+		go work.Run()
+		work.PostAction(types.Configure{Config: account})
+		workers = append(workers, work)
+	}
 	for {
-		if msg := w.GetMessage(); msg != nil {
-			fmt.Printf("<- %T: %v\n", msg, msg)
+		for _, worker := range workers {
+			if msg := worker.GetMessage(); msg != nil {
+				fmt.Printf("<- %T\n", msg)
+			}
 		}
 	}
 }
diff --git a/config/config.go b/config/config.go
index 6a420fa..a7e9d84 100644
--- a/config/config.go
+++ b/config/config.go
@@ -4,7 +4,9 @@ import (
 	"github.com/go-ini/ini"
 	"github.com/kyoh86/xdg"
 
+	"fmt"
 	"path"
+	"strings"
 	"unicode"
 )
 
@@ -47,6 +49,43 @@ func mapName(raw string) string {
 	return string(newstr)
 }
 
+func loadAccountConfig(path string) ([]AccountConfig, error) {
+	var (
+		file     *ini.File
+		err      error
+		accounts []AccountConfig
+	)
+	accounts = make([]AccountConfig, 0)
+	if file, err = ini.Load(path); err != nil {
+		return nil, err
+	}
+	file.NameMapper = mapName
+	for _, _sec := range file.SectionStrings() {
+		if _sec == "DEFAULT" {
+			continue
+		}
+		sec := file.Section(_sec)
+		account := AccountConfig{Name: _sec}
+		if err = sec.MapTo(&account); err != nil {
+			return nil, err
+		}
+		for key, val := range sec.KeysHash() {
+			if key == "source" {
+				account.Source = val
+			} else if key == "folders" {
+				account.Folders = strings.Split(val, ",")
+			} else if key != "name" {
+				account.Params[key] = val
+			}
+		}
+		if account.Source == "" {
+			return nil, fmt.Errorf("Expected source for account %s", _sec)
+		}
+		accounts = append(accounts, account)
+	}
+	return accounts, nil
+}
+
 func LoadConfig(root *string) (*AercConfig, error) {
 	var (
 		err  error
@@ -80,5 +119,11 @@ func LoadConfig(root *string) (*AercConfig, error) {
 	if ui, err := file.GetSection("ui"); err != nil {
 		ui.MapTo(config.Ui)
 	}
+	accountsPath := path.Join(*root, "accounts.conf")
+	if accounts, err := loadAccountConfig(accountsPath); err != nil {
+		return nil, err
+	} else {
+		config.Accounts = accounts
+	}
 	return config, nil
 }
diff --git a/worker/imap/worker.go b/worker/imap/worker.go
index a095e60..97cd4b0 100644
--- a/worker/imap/worker.go
+++ b/worker/imap/worker.go
@@ -34,11 +34,11 @@ func (w *IMAPWorker) PostAction(msg types.WorkerMessage) {
 func (w *IMAPWorker) handleMessage(_msg types.WorkerMessage) {
 	switch msg := _msg.(type) {
 	case types.Ping:
-		w.messages <- &types.Ack{
+		w.messages <- types.Ack{
 			Message: types.RespondTo(msg),
 		}
 	default:
-		w.messages <- &types.Unsupported{
+		w.messages <- types.Unsupported{
 			Message: types.RespondTo(_msg),
 		}
 	}
@@ -49,7 +49,7 @@ func (w *IMAPWorker) Run() {
 	for {
 		select {
 		case msg := <-w.actions:
-			fmt.Printf("<= %T: %+v\n", msg, msg)
+			fmt.Printf("<= %T\n", msg)
 			w.handleMessage(msg)
 		default:
 			// no-op
diff --git a/worker/worker.go b/worker/worker.go
index 1f9f04c..a504790 100644
--- a/worker/worker.go
+++ b/worker/worker.go
@@ -3,6 +3,9 @@ package worker
 import (
 	"git.sr.ht/~sircmpwn/aerc2/worker/imap"
 	"git.sr.ht/~sircmpwn/aerc2/worker/types"
+
+	"fmt"
+	"net/url"
 )
 
 type Worker interface {
@@ -12,7 +15,18 @@ type Worker interface {
 }
 
 // Guesses the appropriate worker type based on the given source string
-func NewWorker(source string) Worker {
-	// TODO: Do this properly
-	return imap.NewIMAPWorker()
+func NewWorker(source string) (Worker, error) {
+	var (
+		u   *url.URL
+		err error
+	)
+	if u, err = url.Parse(source); err != nil {
+		return nil, err
+	}
+	switch u.Scheme {
+	case "imap":
+	case "imaps":
+		return imap.NewIMAPWorker(), nil
+	}
+	return nil, fmt.Errorf("Unknown backend %s", u.Scheme)
 }