about summary refs log tree commit diff stats
path: root/config/config.go
diff options
context:
space:
mode:
Diffstat (limited to 'config/config.go')
-rw-r--r--config/config.go85
1 files changed, 85 insertions, 0 deletions
diff --git a/config/config.go b/config/config.go
new file mode 100644
index 0000000..b620258
--- /dev/null
+++ b/config/config.go
@@ -0,0 +1,85 @@
+package config
+
+import (
+	"github.com/go-ini/ini"
+	"github.com/kyoh86/xdg"
+
+	"path"
+	"unicode"
+)
+
+type UIConfig struct {
+	IndexFormat       string
+	TimestampFormat   string
+	ShowHeaders       []string `delim:","`
+	LoadingFrames     []string `delim:","`
+	RenderAccountTabs string
+	SidebarWidth      int
+	PreviewHeight     int
+	EmptyMessage      string
+}
+
+type AccountConfig struct {
+	ConfigPath string
+	Name       string
+	Source     string
+	Folders    []string
+	Params     map[string]string
+}
+
+type AercConfig struct {
+	Ini      *ini.File       `ini:"-"`
+	Accounts []AccountConfig `ini:"-"`
+	Ui       UIConfig
+}
+
+// Input: TimestampFormat
+// Output: timestamp-format
+func mapName(raw string) string {
+	newstr := make([]rune, 0, len(raw))
+	for i, chr := range raw {
+		if isUpper := 'A' <= chr && chr <= 'Z'; isUpper {
+			if i > 0 {
+				newstr = append(newstr, '-')
+			}
+		}
+		newstr = append(newstr, unicode.ToLower(chr))
+	}
+	return string(newstr)
+}
+
+func LoadConfig(root *string) (*AercConfig, error) {
+	var (
+		err  error
+		file *ini.File
+	)
+	if root == nil {
+		_root := path.Join(xdg.ConfigHome(), "aerc")
+		root = &_root
+	}
+	if file, err = ini.Load(path.Join(*root, "aerc.conf")); err != nil {
+		return nil, err
+	}
+	file.NameMapper = mapName
+	config := &AercConfig{
+		Ini: file,
+		Ui: UIConfig{
+			IndexFormat:     "%4C %Z %D %-17.17n %s",
+			TimestampFormat: "%F %l:%M %p",
+			ShowHeaders: []string{
+				"From", "To", "Cc", "Bcc", "Subject", "Date",
+			},
+			LoadingFrames: []string{
+				"[..]  ", " [..] ", "  [..]", " [..] ",
+			},
+			RenderAccountTabs: "auto",
+			SidebarWidth:      20,
+			PreviewHeight:     12,
+			EmptyMessage:      "(no messages)",
+		},
+	}
+	if ui, err := file.GetSection("ui"); err != nil {
+		ui.MapTo(config.Ui)
+	}
+	return config, nil
+}