Skip to content

Commit

Permalink
refactoring: use generics to make config less repetitive
Browse files Browse the repository at this point in the history
  • Loading branch information
koestler committed Aug 26, 2023
1 parent 14a24ab commit b6d391f
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 321 deletions.
189 changes: 76 additions & 113 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package config
import (
"fmt"
"github.com/google/uuid"
"golang.org/x/exp/maps"
"gopkg.in/yaml.v2"
"log"
"net/url"
Expand Down Expand Up @@ -80,16 +81,45 @@ func (c configRead) TransformAndValidate() (ret Config, err []error) {
ret.logWorkerStart = true
}

ret.mqttClients, e = c.MqttClients.TransformAndValidate()
ret.mqttClients, e = TransformAndValidateMapToList(
c.MqttClients,
func(inp mqttClientConfigRead, name string) (MqttClientConfig, []error) {
return inp.TransformAndValidate(name)
},
)
err = append(err, e...)
if len(ret.mqttClients) < 1 {
err = append(err, fmt.Errorf("MqttClients section must no be empty"))
}

ret.influxClients, e = c.InfluxClients.TransformAndValidate()
ret.influxClients, e = TransformAndValidateMapToList(
c.InfluxClients,
func(inp influxClientConfigRead, name string) (InfluxClientConfig, []error) {
return inp.TransformAndValidate(name)
},
)
err = append(err, e...)
if len(ret.influxClients) < 1 {
err = append(err, fmt.Errorf("InfluxClients section must no be empty"))
}

ret.converters, e = c.Converters.TransformAndValidate(ret.mqttClients, ret.influxClients)
ret.converters, e = TransformAndValidateMapToList(
c.Converters,
func(inp converterConfigRead, name string) (ConverterConfig, []error) {
return inp.TransformAndValidate(name, ret.mqttClients, ret.influxClients)
},
)
err = append(err, e...)
if len(ret.converters) < 1 {
err = append(err, fmt.Errorf("converters section must no be empty"))
}

ret.influxAuxiliaryTags, e = c.InfluxAuxiliaryTags.TransformAndValidate()
ret.influxAuxiliaryTags, e = TransformAndValidateList(
c.InfluxAuxiliaryTags,
func(inp influxAuxiliaryTagsRead) (InfluxAuxiliaryTags, []error) {
return inp.TransformAndValidate()
},
)
err = append(err, e...)

return
Expand Down Expand Up @@ -182,34 +212,6 @@ func (c *statisticsConfigRead) TransformAndValidate() (ret StatisticsConfig, err
return
}

func (c mqttClientConfigReadMap) getOrderedKeys() (ret []string) {
ret = make([]string, len(c))
i := 0
for k := range c {
ret[i] = k
i++
}
sort.Strings(ret)
return
}

func (c mqttClientConfigReadMap) TransformAndValidate() (ret []MqttClientConfig, err []error) {
if len(c) < 1 {
return ret, []error{fmt.Errorf("MqttClients section must no be empty")}
}

ret = make([]MqttClientConfig, len(c))
j := 0
for _, name := range c.getOrderedKeys() {
r, e := c[name].TransformAndValidate(name)
ret[j] = r
err = append(err, e...)
j++
}

return
}

func (c mqttClientConfigRead) TransformAndValidate(name string) (ret MqttClientConfig, err []error) {
ret = MqttClientConfig{
name: name,
Expand Down Expand Up @@ -323,33 +325,6 @@ func (c mqttClientConfigRead) TransformAndValidate(name string) (ret MqttClientC
return
}

func (c influxClientConfigReadMap) getOrderedKeys() (ret []string) {
ret = make([]string, len(c))
i := 0
for k := range c {
ret[i] = k
i++
}
sort.Strings(ret)
return
}

func (c influxClientConfigReadMap) TransformAndValidate() (ret []InfluxClientConfig, err []error) {
if len(c) < 1 {
return ret, []error{fmt.Errorf("InfluxClients section must no be empty")}
}

ret = make([]InfluxClientConfig, len(c))
j := 0
for _, name := range c.getOrderedKeys() {
r, e := c[name].TransformAndValidate(name)
ret[j] = r
err = append(err, e...)
j++
}
return
}

func (c influxClientConfigRead) TransformAndValidate(name string) (ret InfluxClientConfig, err []error) {
ret = InfluxClientConfig{
name: name,
Expand Down Expand Up @@ -477,36 +452,6 @@ func (c influxClientConfigRead) TransformAndValidate(name string) (ret InfluxCli
return
}

func (c converterConfigReadMap) getOrderedKeys() (ret []string) {
ret = make([]string, len(c))
i := 0
for k := range c {
ret[i] = k
i++
}
sort.Strings(ret)
return
}

func (c converterConfigReadMap) TransformAndValidate(
mqttClients []MqttClientConfig,
influxClients []InfluxClientConfig,
) (ret []ConverterConfig, err []error) {
if len(c) < 1 {
return ret, []error{fmt.Errorf("converters section must no be empty")}
}

ret = make([]ConverterConfig, len(c))
j := 0
for _, name := range c.getOrderedKeys() {
r, e := c[name].TransformAndValidate(name, mqttClients, influxClients)
ret[j] = r
err = append(err, e...)
j++
}
return
}

func (c converterConfigRead) TransformAndValidate(
name string,
mqttClients []MqttClientConfig,
Expand All @@ -528,8 +473,16 @@ func (c converterConfigRead) TransformAndValidate(
}

var e []error
ret.mqttTopics, e = c.MqttTopics.TransformAndValidate()
ret.mqttTopics, e = TransformAndValidateList(
c.MqttTopics,
func(inp mqttTopicConfigRead) (MqttTopicConfig, []error) {
return inp.TransformAndValidate()
},
)
err = append(err, e...)
if len(ret.mqttTopics) < 1 {
err = append(err, fmt.Errorf("mqttTopics section must no be empty"))
}

// validate that all listed mqttClients exist
for _, clientName := range ret.mqttClients {
Expand Down Expand Up @@ -576,20 +529,6 @@ func (c converterConfigRead) TransformAndValidate(
return
}

func (c mqttTopicConfigReadList) TransformAndValidate() (ret []MqttTopicConfig, err []error) {
if len(c) < 1 {
return ret, []error{fmt.Errorf("mqttTopics section must no be empty")}
}

ret = make([]MqttTopicConfig, len(c))
for i, t := range c {
r, e := t.TransformAndValidate()
ret[i] = r
err = append(err, e...)
}
return
}

func (c mqttTopicConfigRead) TransformAndValidate() (ret MqttTopicConfig, err []error) {
ret = MqttTopicConfig{
topic: c.Topic,
Expand Down Expand Up @@ -625,15 +564,6 @@ func (c MqttTopicConfig) ApplyTopicReplace(f ApplyTopicReplaceFunc) MqttTopicCon
device: c.device,
}
}
func (c influxAuxiliaryTagsReadList) TransformAndValidate() (ret []InfluxAuxiliaryTags, err []error) {
ret = make([]InfluxAuxiliaryTags, len(c))
for i, t := range c {
r, e := t.TransformAndValidate()
ret[i] = r
err = append(err, e...)
}
return
}

func (c influxAuxiliaryTagsRead) TransformAndValidate() (ret InfluxAuxiliaryTags, err []error) {
ret = InfluxAuxiliaryTags{
Expand Down Expand Up @@ -670,3 +600,36 @@ func (c influxAuxiliaryTagsRead) TransformAndValidate() (ret InfluxAuxiliaryTags

return
}

func TransformAndValidateMapToList[I any, O any](
inp map[string]I,
transformer func(inp I, name string) (ret O, err []error),
) (ret []O, err []error) {
keys := maps.Keys(inp)
sort.Strings(keys)

ret = make([]O, len(inp))
j := 0
for _, name := range keys {
r, e := transformer(inp[name], name)
ret[j] = r
err = append(err, e...)
j++
}
return
}

func TransformAndValidateList[I any, O any](
inp []I,
transformer func(inp I) (ret O, err []error),
) (ret []O, err []error) {
ret = make([]O, 0, len(inp))
for _, cr := range inp {
r, e := transformer(cr)

ret = append(ret, r)
err = append(err, e...)
}

return
}
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ require (
github.com/lestrrat-go/apache-logformat v2.0.4+incompatible
github.com/mattn/go-sqlite3 v1.14.17
github.com/pkg/errors v0.9.1
golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63
gopkg.in/yaml.v2 v2.4.0
)

Expand Down
Loading

0 comments on commit b6d391f

Please sign in to comment.