/
config.go
106 lines (88 loc) · 2.04 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
package logman
import "fmt"
type ChannelConfig interface {
DriverName() string
}
type ChannelConfigs map[string]ChannelConfig
type ChannelArbitraryConfig struct {
Driver string
Level Level
Extra map[string]interface{}
}
func (c ChannelArbitraryConfig) DriverName() string {
return c.Driver
}
type ChannelArbitraryConfigs map[string]ChannelArbitraryConfig
type Config struct {
DefaultChannel string
Level Level
Channels ChannelConfigs
}
func NewConfig() Config {
cfg := Config{
DefaultChannel: "stack",
Level: DebugLevel,
}
return cfg
}
func NewLoggerChannels() ChannelArbitraryConfigs {
c := make(ChannelArbitraryConfigs)
c["stack"] = ChannelArbitraryConfig{
Driver: "stack",
Extra: map[string]interface{}{
"channels": []interface{}{
map[interface{}]interface{}{"name": "stderr"},
},
},
}
c["stderr"] = ChannelArbitraryConfig{Driver: "zap"}
return c
}
func (cfg Config) WithChannels(chs ChannelArbitraryConfigs) Config {
if cfg.Channels == nil {
cfg.Channels = map[string]ChannelConfig{}
}
for chName, chCfg := range chs {
cfg.Channels[chName] = chCfg
}
return cfg
}
func (c *Config) setDefaults() *Config {
if c.Level == NotSet {
c.Level = InfoLevel
}
return c
}
func (cfg Config) validate() error {
if cfg.Level < CriticalLevel || cfg.Level > DebugLevel {
return fmt.Errorf("Level \"%d\": %w", cfg.Level, InvalidConfigValueErr)
}
if len(cfg.Channels) == 0 {
return NoChannelsConfiguredErr
}
if cfg.DefaultChannel == "" {
return DefaultChannelIsNotSetErr
}
if _, exists := cfg.Channels[cfg.DefaultChannel]; !exists {
return fmt.Errorf(
"Channel \"%s\": %w",
cfg.DefaultChannel,
NoConfigForDefaultChannelErr,
)
}
for chName, chCfg := range cfg.Channels {
if chCfg.DriverName() == "" {
return fmt.Errorf("Channel \"%s\": %w", chName, DriverIsNotSetErr)
}
_, exists := drivers[chCfg.DriverName()]
if !exists {
return fmt.Errorf(
"Channel \"%s\", driver \"%s\": %w",
chName,
chCfg.DriverName(),
UnknownDriverErr,
)
}
}
return nil
}