-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconfig.go
84 lines (67 loc) · 1.24 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
package plant
import (
"os"
"strings"
"github.com/spf13/viper"
)
const (
PrefixPlant = "plant/"
PrefixPrivate = "x/"
)
type (
Config struct {
Bot ConfigBot `yaml:"bot"`
Deps []M `yaml:"deps"`
Mods []M `yaml:"mods"`
}
ConfigBot struct {
File string `yaml:"file"`
}
)
func Parse(path string) (c Config, _ error) {
v := viper.New()
v.SetConfigFile(path)
// Defaults
v.SetDefault("bot.file", "bot.yml")
if err := v.ReadInConfig(); err != nil {
return Config{}, err
}
return c, v.Unmarshal(&c)
}
func (c Config) OfPrefix(ms []M, prefix string) (filtered []M) {
for _, m := range ms {
if strings.HasPrefix(m.Name(), prefix) {
filtered = append(filtered, m)
}
}
return filtered
}
func (c Config) V(m M) V {
v := viper.New()
v.MergeConfigMap(m)
return V{Viper: v}
}
type (
M map[string]any
V struct{ *viper.Viper }
)
func (m M) Name() string {
return m["import"].(string)
}
func (v V) GetEnv(name string) string {
s := v.GetString(name)
if s == "" {
return s
}
return EnvString(s).String()
}
type EnvString string
func (e EnvString) IsEnv() bool {
return len(e) > 0 && e[0] == '$'
}
func (e EnvString) String() string {
if e.IsEnv() {
return os.Getenv(string(e[1:]))
}
return string(e)
}