/
config.go
135 lines (104 loc) · 2.06 KB
/
config.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package lib
import (
"fmt"
"io/ioutil"
"os"
"os/user"
"path"
"github.com/friedenberg/z/lib/kasten"
"github.com/pelletier/go-toml/v2"
)
type ConfigTagForNewZettels struct {
TagForNewZettels string `toml:"tag-for-new-zettels"`
}
type KastenConfig struct {
ConfigTagForNewZettels
Implementation string `toml:"type"`
Options map[string]interface{}
}
type TagConfig struct {
kasten string
autoTags []string `toml:"auto-tags"`
}
type Config struct {
ConfigTagForNewZettels
Tags map[string]TagConfig
Kasten map[string]KastenConfig
DefaultKasten string `toml:"default-kasten"`
}
func DefaultConfigPath() (p string, err error) {
usr, err := user.Current()
if err != nil {
return
}
p = path.Join(
usr.HomeDir,
".config",
"zettelkasten",
"config.toml",
)
return
}
func LoadConfig(p string) (c Config, err error) {
f, err := os.Open(p)
if err != nil {
return
}
defer f.Close()
doc, err := ioutil.ReadAll(f)
defer func() {
if r := recover(); r != nil {
c = Config{}
err = fmt.Errorf("toml unmarshalling paniced: %q", r)
}
}()
err = toml.Unmarshal([]byte(doc), &c)
if err != nil {
return
}
return
}
func DefaultConfig() (c Config, err error) {
//TODO
return
}
func LoadDefaultConfig() (c Config, err error) {
p, err := DefaultConfigPath()
if err != nil {
return
}
c, err = LoadConfig(p)
if os.IsNotExist(err) {
c, err = DefaultConfig()
return
} else if err != nil {
return
}
return
}
func (c Config) Umwelt() (e Umwelt, err error) {
e.Kasten = make(map[string]kasten.Implementation)
for n, kc := range c.Kasten {
if i, ok := kasten.Registry.Get(kc.Implementation); ok {
i.InitFromOptions(kc.Options)
e.Kasten[n] = i
//TODO
e.DefaultKasten = i
} else {
err = fmt.Errorf("missing implementation for kasten from config: '%s'", n)
return
}
}
if c.DefaultKasten != "" {
if i, ok := e.Kasten[c.DefaultKasten]; ok {
e.DefaultKasten = i
} else {
err = fmt.Errorf(
"no kasten matching name '%s' for default",
c.DefaultKasten,
)
return
}
}
return
}