forked from evcc-io/evcc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconfig.go
176 lines (144 loc) Β· 4.27 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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
package provider
import (
"fmt"
)
// provider types
type (
IntProvider interface {
IntGetter() func() (int64, error)
}
StringProvider interface {
StringGetter() func() (string, error)
}
FloatProvider interface {
FloatGetter() func() (float64, error)
}
BoolProvider interface {
BoolGetter() func() (bool, error)
}
SetIntProvider interface {
IntSetter(param string) func(int64) error
}
SetStringProvider interface {
StringSetter(param string) func(string) error
}
SetBoolProvider interface {
BoolSetter(param string) func(bool) error
}
)
type providerRegistry map[string]func(map[string]interface{}) (IntProvider, error)
func (r providerRegistry) Add(name string, factory func(map[string]interface{}) (IntProvider, error)) {
if _, exists := r[name]; exists {
panic(fmt.Sprintf("cannot register duplicate plugin type: %s", name))
}
r[name] = factory
}
func (r providerRegistry) Get(name string) (func(map[string]interface{}) (IntProvider, error), error) {
factory, exists := r[name]
if !exists {
return nil, fmt.Errorf("invalid plugin source: %s", name)
}
return factory, nil
}
var registry providerRegistry = make(map[string]func(map[string]interface{}) (IntProvider, error))
// Config is the general provider config
type Config struct {
Source string
Other map[string]interface{} `mapstructure:",remain"`
}
// NewIntGetterFromConfig creates a IntGetter from config
func NewIntGetterFromConfig(config Config) (res func() (int64, error), err error) {
factory, err := registry.Get(config.Source)
if err == nil {
var provider IntProvider
provider, err = factory(config.Other)
if err == nil {
res = provider.IntGetter()
}
}
if err == nil && res == nil {
err = fmt.Errorf("invalid plugin source: %s", config.Source)
}
return
}
// NewFloatGetterFromConfig creates a FloatGetter from config
func NewFloatGetterFromConfig(config Config) (res func() (float64, error), err error) {
factory, err := registry.Get(config.Source)
if err == nil {
var provider IntProvider
provider, err = factory(config.Other)
if prov, ok := provider.(FloatProvider); ok {
res = prov.FloatGetter()
}
}
if err == nil && res == nil {
err = fmt.Errorf("invalid plugin source: %s", config.Source)
}
return
}
// NewStringGetterFromConfig creates a StringGetter from config
func NewStringGetterFromConfig(config Config) (res func() (string, error), err error) {
switch typ := config.Source; typ {
case "combined", "openwb":
res, err = NewOpenWBStatusProviderFromConfig(config.Other)
default:
var factory func(map[string]interface{}) (IntProvider, error)
factory, err = registry.Get(typ)
if err == nil {
var provider IntProvider
provider, err = factory(config.Other)
if prov, ok := provider.(StringProvider); ok {
res = prov.StringGetter()
}
}
if err == nil && res == nil {
err = fmt.Errorf("invalid plugin source: %s", config.Source)
}
}
return
}
// NewBoolGetterFromConfig creates a BoolGetter from config
func NewBoolGetterFromConfig(config Config) (res func() (bool, error), err error) {
factory, err := registry.Get(config.Source)
if err == nil {
var provider IntProvider
provider, err = factory(config.Other)
if prov, ok := provider.(BoolProvider); ok {
res = prov.BoolGetter()
}
}
if err == nil && res == nil {
err = fmt.Errorf("invalid plugin source: %s", config.Source)
}
return
}
// NewIntSetterFromConfig creates a IntSetter from config
func NewIntSetterFromConfig(param string, config Config) (res func(int64) error, err error) {
factory, err := registry.Get(config.Source)
if err == nil {
var provider IntProvider
provider, err = factory(config.Other)
if prov, ok := provider.(SetIntProvider); ok {
res = prov.IntSetter(param)
}
}
if err == nil && res == nil {
err = fmt.Errorf("invalid plugin source: %s", config.Source)
}
return
}
// NewBoolSetterFromConfig creates a BoolSetter from config
func NewBoolSetterFromConfig(param string, config Config) (res func(bool) error, err error) {
factory, err := registry.Get(config.Source)
if err == nil {
var provider IntProvider
provider, err = factory(config.Other)
if prov, ok := provider.(SetBoolProvider); ok {
res = prov.BoolSetter(param)
}
}
if err == nil && res == nil {
err = fmt.Errorf("invalid plugin source: %s", config.Source)
}
return
}