aboutsummaryrefslogtreecommitdiff
path: root/config/config.go
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2018-01-09 19:18:19 -0500
committerDrew DeVault <sir@cmpwn.com>2018-01-09 19:28:43 -0500
commit39c93d2897af5bb0c145ef4f99f542bf42babdab (patch)
tree4a3d3ac3553b2d2f31960a7af35ea286b62597d7 /config/config.go
parentaeb700577b5b2955c75093129e01de49b92f124f (diff)
Load UI configuration
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
+}